2

我正在编写一个很大程度上基于 CoreData 的 iPad 烹饪应用程序。在我的应用程序中,我有一个用于编辑配方的屏幕,其中包含 2 种类型的信息:

  1. 带有配方类别\子类别和国家/地区的列表
  2. 所有其他配方相关信息

这个列表中的每一个都可以在弹出框中进行编辑。此列表的更改应立即保留(即,如果用户将某些配方类别添加到可能的类别列表中,但取消了配方创建,则该类别应可用于所有配方)。决定实现2 个单独的 NSManagedObjectContexts来处理每种类型的信息:配方管理的主要上下文和列表的支持上下文

通过MagicalRecord框架执行的所有核心数据操作。两个上下文都将 MagicalRecord 的默认上下文作为父上下文。每个上下文都会观察另一个上下文的变化。所有上下文都在主线程上创建和使用,所以这个问题似乎与多线程问题无关。

当我尝试在支持上下文中创建对象并在对象创建后立即在支持上下文中保持更改时,一切正常。当新创建的对象在创建后立即被删除时出现问题 - 收到 EXC_BAD_ACCES。但是,该实体正在正确持久化,并且在下次启动时可以使用和删除它而不会出现同步问题。

1 注意:当通过 existingObjectWithID: 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 文档中的变更管理部分没有给出任何内容。同样的结果给了谷歌。

4

1 回答 1

0

不要那样做。一个上下文在观察另一个也在观察观察者......这很糟糕。您首先需要了解嵌套上下文的规则以及数据在保存时如何从一个上下文流向另一个。

在你的情况下,你可能想在 NSMOC 上查找 MR_confinementContext 方法。这将创建一个使用旧线程限制模型的上下文。这可以帮助您避免线程崩溃。但首先,不要进行循环观察……数据流入

于 2013-02-26T16:48:46.393 回答