【发布时间】:2015-06-05 09:06:01
【问题描述】:
在我的应用程序中,用户必须按一个按钮来生成数据,这些数据在专用线程中创建和处理,然后通过 Core Data 存储。该按钮在按下后立即被禁用,只有在通过 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()- 清除核心数据管理阵列控制器。
- 将所有新生成的对象添加到数组控制器。
notificationCenter.addObserver("didSaveNotification")coreData.saveData()
- 保存完成后,调用
didSaveNotification()广播通知以便再次启用GUI:notificationCenter.postNotificationName("generationComplete")
- View 类收到通知并再次启用按钮。
这基本上是点击按钮后的操作流程。在不再需要通知观察者之后,它们会立即在任何地方再次被删除,但我没有在上面包括。我看不出有什么问题。乍一看,代码似乎可以证明,但显然某处出了问题。发送NSManagedObjectContextDidSaveNotification后,核心数据不应该完成保存吗?同样地,在它自己的线程上执行的整个生成代码也是如此。
这个应用是为了在应用商店上发布,所以我不想在里面留下这样的错误。有人知道导致崩溃的原因吗?
【问题讨论】:
-
你在哪里禁用按钮?哪一步?
-
在按钮的 IBAction 中单击按钮后立即禁用该按钮。 ...看起来我刚刚设法解决了这个问题...
标签: multithreading macos swift cocoa core-data