我们一直在尝试调试Core Data多上下文/线程问题,其中将Core Data保存通知合并到我们的主线程中NSManagedObjectContext
会导致应用偶尔崩溃。这使我们的应用会话数量减少了约2%,而如何解决此问题我们感到茫然。对于可能导致此崩溃的原因的任何指导或一般建议,我们将非常感谢。
我们有一个核心数据设置,如下所示:
注意:这是从[MagicalRecord setupAutoMigratingCoreDataStack]创建的Magical Record v2.3中的默认核心数据堆栈。
这是我们的应用程序崩溃的情况:
NSManagedObject
在Root Saving Context中将JSON解析为s(一些新实体,一些更新实体)NSManagedObjectContextDidSaveNotification
由Core Data广播。主队列上的默认上下文会观察到此情况,并在主线程上调用mergeChangesFromContextDidSaveNotification:
with的NSDictionary
更改。objectID
发送到无效对象(很可能NSManagedObject
已被释放)时,它崩溃。这是在的私有实现中发生的,NSManagedObjectContext
mergeChangesFromContextDidSaveNotification:
因此我们无法看到这里实际上出了什么问题。在这一点上,我们所能知道的一切都不存在。
这仅发生在核心数据保存的一小部分上,这表明这可能不是我们的核心数据→API堆栈中的根本缺陷。此外,没有迹象表明上下文更改的大小(插入/更新/删除)的大小或类型对崩溃的可能性有任何影响。
自从发布此问题以来已经有一段时间了,重新发现之后,我想回答我自己的问题,以便其他人找到该主题。
在我的情况下,我已经从NSManagedObjectContexts
通过进行更新的同级迁移了很大的代码库NSManagedObjectContextDidSaveNotification
。但是,尽管这确实暴露了问题,但问题实际上与它无关。
造成这种情况的真正原因是,以前的工程师设置了代码的较旧部分,并在NSManagedObject
s上设置了KVO及其属性。事实证明,在核心数据实体上使用KVO实际上是一个非常非常糟糕的主意。
更准确地说,当在实体上设置KVO并且从中删除了对象或该对象上的关系的目标时,似乎发生了这种情况NSPersistentStore
。第二种情况似乎不是造成此问题的唯一原因,但在我看来,这绝对是一个非常突出的原因。
得到教训:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句