multithreading - 敲击按钮后应用程序崩溃

标签 multithreading macos swift cocoa 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. 清晰的核心数据管理阵列 Controller 。
    3. 将所有新生成的对象添加到数组 Controller 。
    4. notificationCenter.addObserver("didSaveNotification")
    5. coreData.saveData()
  6. 保存完成后,调用 didSaveNotification() 广播通知,以便可以再次启用 GUI:
    1. notificationCenter.postNotificationName("GenerationComplete")
  7. View 类收到通知并再次启用按钮。

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

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

最佳答案

对于它的值(value)...

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

关于multithreading - 敲击按钮后应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662537/

相关文章:

c++ - 如何休眠 APR 线程?

java - Java 中的线程

objective-c - USB 设备发送/接收数据

ios - Mac Agent for Xamarin 是否需要 Apple 开发者帐户?

macos - 如何在 MacOS 上获取 shell 脚本的绝对路径名?

swift - UIAlert 不再打开,Xcode 告诉我调试 NSLayoutConstraintToNilAnchor

swift 无法将 .m3u8 文件保存到图库

c# - 将大型 CSV 文件并行导出到 SQL Server

c# - Task.Delay 在专用线程上有意义吗?

swift - 自iOS 13起,每个UIAlertController都会在用户响应之前自动消失