【问题标题】:App crash after hammering button敲击按钮后应用程序崩溃
【发布时间】:2015-06-05 09:06:01
【问题描述】:

在我的应用程序中,用户必须按一个按钮来生成数据,这些数据在专用线程中创建和处理,然后通过 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. View 类收到通知并再次启用按钮。

这基本上是点击按钮后的操作流程。在不再需要通知观察者之后,它们会立即在任何地方再次被删除,但我没有在上面包括。我看不出有什么问题。乍一看,代码似乎可以证明,但显然某处出了问题。发送NSManagedObjectContextDidSaveNotification后,核心数据不应该完成保存吗?同样地,在它自己的线程上执行的整个生成代码也是如此。

这个应用是为了在应用商店上发布,所以我不想在里面留下这样的错误。有人知道导致崩溃的原因吗?

【问题讨论】:

  • 你在哪里禁用按钮?哪一步?
  • 在按钮的 IBAction 中单击按钮后立即禁用该按钮。 ...看起来我刚刚设法解决了这个问题...

标签: multithreading macos swift cocoa core-data


【解决方案1】:

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

我设法解决了这个问题。由于我的代码的复杂性,我没有看到用于清除阵列控制器以获取生成的数据的命令会干扰添加新数据的部分。与此有些出入。所以现在我对与数据生成和并发操作相关的整个代码进行了重构和优化,现在无论我现在敲按钮的速度有多快,我都无法再重现这个错误了。现在,在将新数据添加到 AC 之前,AC 会被清除一次。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多