锤击按钮

时间:2015-06-05 09:06:02

标签: multithreading macos swift cocoa core-data

在我的应用程序中,用户必须按下按钮才能生成在专用线程中创建和处理的数据,然后通过Core Data存储。该按钮在按下后立即被禁用,并且仅在通过Core Data保存数据后再次启用。

但是,如果我反复快速点击按钮,它会正常工作一段时间但是很短的时间后应用程序会崩溃EXC_BAD_ACCESS (code=1, address=0x0)或者我收到警告说核心数据无法保存,所以我想知道什么可能导致这些问题?

结构大纲看起来像这样(伪代码):

  1. 用户点击按钮
  2. notificationCenter.addObserver("didFinishGenerationOperation")
  3. NSOperationQueue.addOperation(dataGenerationOperation)
  4. dataGenerationOperation.completionBlock { dispatch_async(dispatch_get_main_queue() { notificationCenter.postNotificationName("didFinishGenerationOperation") } }
  5. 调用didFinishNameGenerationOperation()执行以下操作:
    1. processingQueue.waitUntilAllOperationsAreFinished()
    2. 清除核心数据管理的阵列控制器。
    3. 将所有新生成的对象添加到阵列控制器。
    4. notificationCenter.addObserver("didSaveNotification")
    5. coreData.saveData()
  6. 保存完成后,调用didSaveNotification()广播通知,以便再次启用GUI:
    1. notificationCenter.postNotificationName("generationComplete")
  7. 视图类接收通知并再次启用该按钮。
  8. 这基本上是单击按钮后的操作流程。通知观察员在不再需要之后立即再次被移除,但我没有包括上述内容。我看不出有什么不对。起初看起来代码似乎是证据,但显然某些地方出现了问题。在发送NSManagedObjectContextDidSaveNotification后,核心数据不应该通过保存完成吗?同样,使用在自己的线程上执行的整代代码。

    这个应用程序是在应用商店发布的,所以我不想留下这样的错误。有人知道可能导致崩溃的原因吗?

1 个答案:

答案 0 :(得分:0)

为了它的价值......

我成功解决了这个问题。这是由于我的代码的复杂性,我没有看到用于清除阵列控制器的生成数据的一个命令干扰了添加新数据的部分。与此存在一些差异。所以现在我重新构建并优化了与数据生成和并发操作相关的整个代码,无论我现在按下按钮有多快,我都无法再现错误。在将新数据添加到AC之前,AC现在只清除一次。