在我的应用程序中,用户必须按下按钮来生成数据,该数据在专用线程中创建和处理,然后通过核心数据存储。该按钮在按下后立即被禁用,只有在通过 Core Data 保存数据后才再次启用。
但是,如果我快速重复单击该按钮,它会正常工作一段时间,但不久之后,应用程序要么因 EXC_BAD_ACCESS (code=1, address=0x0)
崩溃,要么收到警告:无法保存核心数据,所以我想知道什么可能导致这些问题?
结构概要如下(伪代码):
- 用户点击按钮
notificationCenter.addObserver("didFinishGenerationOperation")
NSOperationQueue.addOperation(dataGenerationOperation)
dataGenerationOperation.completionBlock { dispatch_async(dispatch_get_main_queue() { notificationCenter.postNotificationName("didFinishGenerationOperation") } }
- 调用
didFinishNameGenerationOperation()
执行以下操作:processingQueue.waitUntilAllOperationsAreFinished()
- 清晰的核心数据管理阵列 Controller 。
- 将所有新生成的对象添加到数组 Controller 。
notificationCenter.addObserver("didSaveNotification")
coreData.saveData()
- 保存完成后,调用
didSaveNotification()
广播通知,以便可以再次启用 GUI:notificationCenter.postNotificationName("GenerationComplete")
- View 类收到通知并再次启用按钮。
这基本上就是点击按钮后的操作流程。通知观察者在不再需要后会立即在任何地方再次被删除,但我没有在上面包含它。我不明白有什么问题。乍一看,代码似乎是证据,但显然某个地方出了问题。核心数据在调度 NSManagedObjectContextDidSaveNotification 后不应该完成保存吗?同样,整个生成代码在其自己的线程上执行。
这个应用程序是为了在应用程序商店上发布的,所以我不想在其中留下这样的错误。有人知道可能导致崩溃的原因吗?
最佳答案
对于它的值(value)...
我设法解决了这个问题。由于我的代码很复杂,所以我没有看到用于清除阵列 Controller 以生成数据的命令会干扰添加新数据的部分。与此存在一些差异。所以现在我重组并优化了与数据生成和并发操作相关的整个代码,无论我现在敲击按钮的速度有多快,我都无法再重现该错误。现在,在将新数据添加到 AC 之前,AC 会被清除一次。
关于multithreading - 敲击按钮后应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662537/