在 mergeChangesFromContextDidSaveNotification 中同步上下文时核心数据崩溃 (EXC_BAD_ACCESS)
Posted
技术标签:
【中文标题】在 mergeChangesFromContextDidSaveNotification 中同步上下文时核心数据崩溃 (EXC_BAD_ACCESS)【英文标题】:Core Data crash (EXC_BAD_ACCESS) on synchronizing contexts in mergeChangesFromContextDidSaveNotification 【发布时间】:2013-02-26 15:50:17 【问题描述】:我正在编写一个很大程度上基于 CoreData 的 iPad 烹饪应用程序。 在我的应用中,我有一个用于编辑食谱的屏幕,其中包含 2 种类型的信息:
-
包含配方类别\子类别和国家/地区的列表
所有其他配方相关信息
此列表中的每一个都可以在弹出窗口中进行编辑。此列表的更改应立即保留(即,如果用户将某些配方类别添加到可能的类别列表中,但取消了配方创建,则该类别应适用于所有配方)。 决定实现 2 个单独的 NSManagedObjectContexts 来处理每种类型的信息:main context 用于配方管理,supporting context 用于列表。
通过 MagicalRecord 框架执行的所有核心数据操作。两个上下文都将 MagicalRecord 的默认上下文作为父上下文。每个上下文都会观察另一个上下文的变化。所有上下文都在主线程上创建和使用,所以这个问题似乎与多线程问题无关。
当我尝试在支持上下文中创建对象并在对象创建后立即在支持上下文中保持更改时,一切正常。当新创建的对象在创建后立即被删除时出现问题 - 收到 EXC_BAD_ACCES。 但是,实体已正确持久化,下次启动时可以使用和删除它,而不会出现同步问题。
1 注意:当通过现有ObjectWithID: NSManagedObjectContext 的方法从主上下文 访问对象时,可以删除该对象。然而,崩溃发生在主上下文(主上下文和支持上下文的父上下文)保存时。
这是我的代码:
实体创建:
RecipeCategory* category = [RecipeCategory MR_createInContext:_supportingContext];
category.name = itemName;
[_supportingContext MR_saveToPersistentStoreAndWait];
实体删除:
[(RecipeCategory*)itemToRemove MR_deleteEntity];
[_supportingContext MR_saveToPersistentStoreAndWait];
上下文创建和观察设置:
[_mainContext MR_stopObservingContext:_supportingContext];
[_supportingContext MR_stopObservingContext:_mainContext];
_mainContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
_supportingContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
[_mainContext MR_observeContextOnMainThread:_supportingContext];
[_supportingContext MR_observeContextOnMainThread:_mainContext];
请告知可能导致此问题的原因,因为现在我很困惑,即使我应该采取哪种方式来解决这个问题。 Core Data 文档中的变更管理部分没有给出任何内容。同样的结果给了谷歌。
【问题讨论】:
【参考方案1】:不要那样做。一个上下文在观察另一个也在观察观察者......这很糟糕。您首先需要了解嵌套上下文的规则以及数据在保存时如何从一个上下文流向另一个。
你的情况,你可能想在 NSMOC 上寻找 MR_confinementContext 方法。这将创建一个使用旧线程限制模型的上下文。这可以帮助您避免线程崩溃。但首先,不要进行循环观察……数据流入
【讨论】:
我删除了对上下文的循环观察。现在只有主力手表支持变化。但这并没有帮助,仍然会出现崩溃。顺便说一句,我找到了这个问题的一些解决方法:如果对于我的两个上下文(主要和支持)我将 parent 设置为 MR_rootSavingContext 一切都开始正常工作。但是似乎它不是我使用它的解决方案,因为还需要 iCloud 支持,而 MR_defaultContext 是负责这个的。 您还指出了嵌套上下文的规则以及数据如何相互流动的方式——您能指出一些文章吗?在 google 中搜索主要是给我与 Core Data 多线程问题相关的文章。 不幸的是,目前最好的文档是关于核心数据的 WWDC 视频。您应该能够使用基本的苹果开发者帐户来查看它们。我仍然会避免 iCloud 对核心数据的支持......这在他们的观点上非常糟糕......以上是关于在 mergeChangesFromContextDidSaveNotification 中同步上下文时核心数据崩溃 (EXC_BAD_ACCESS)的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?