gpt4 book ai didi

ios - EXC_BAD_ACCESS 关于 mergeChangesFromContextDidSaveNotification

转载 作者:IT王子 更新时间:2023-10-29 08:12:02 30 4
gpt4 key购买 nike

我们一直在尝试调试 Core Data 多上下文/线程问题,其中将 Core Data 保存通知合并到我们的主线程 NSManagedObjectContext 偶尔会使应用程序崩溃。这导致大约 2% 的应用程序 session 崩溃,我们不知道如何解决这个问题。如果您能就可能导致此次崩溃的原因提供任何指导或一般性建议,我们将不胜感激。

我们有一个如下所示的 Core Data 设置:

Core Data Stack 注意这是从 [MagicalRecord setupAutoMigratingCoreDataStack] 创建的 Magical Record v2.3 中的默认核心数据堆栈

这是我们的应用程序崩溃的场景:

  1. HTTP请求返回JSON
  2. JSON 在 Root Saving Context 上被解析为 NSManagedObject(一些新的实体,一些更新的实体)
  3. Root Saving Context 保存到持久存储
  4. NSManagedObjectContextDidSaveNotification 由 Core Data 广播。主队列上的默认上下文会观察到这一点,并调用 mergeChangesFromContextDidSaveNotification: 并在主线程上使用更改的 NSDictionary
  5. objectID 被发送到无效对象(很可能 NSManagedObject 已被释放)时,它会崩溃。

这发生在 NSManagedObjectContext mergeChangesFromContextDidSaveNotification: 的私有(private)实现中,所以我们不可能看到这里到底出了什么问题;在这一点上我们只能说一个应该存在的对象不存在。

enter image description here

这只发生在一小部分 Core Data 保存中,表明这可能不是我们的 Core Data → API 堆栈中的根本缺陷。此外,没有迹象表明上下文更改中的更改(插入/更新/删除)的大小或类型对崩溃的可能性有任何影响。

最佳答案

NSManagedObjectContextDidSaveNotification 的文档说:

“您可以将通知对象传递给另一个线程上的mergeChangesFromContextDidSaveNotification:,但是您不能直接在另一个线程上使用用户信息字典中的托管对象。有关更多详细信息,请参阅并发与核心核心数据编程指南中的数据。”

也许这就是问题所在?我会确保你从通知中获得的对象被保存在默认上下文中,在它由 Root 发布的同一线程上。

关于ios - EXC_BAD_ACCESS 关于 mergeChangesFromContextDidSaveNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27953692/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com