我正在编写一个基于CoreData的iPad烹饪应用程序。 在我的应用程序中,我有一个用于编辑配方的屏幕,其中包含两种类型的信息:
此列表中的每一个都可以在弹出框中编辑。此列表的更改应立即保留(即,如果用户将某些配方类别添加到可能的类别列表中,但取消配方创建,则此类别应适用于所有配方)。 我们决定实施 2个单独的NSManagedObjectContexts 来处理每种类型的信息:主要上下文用于食谱管理,支持上下文用于列表。
所有核心数据操作均通过 MagicalRecord 框架执行。两个上下文都将MagicalRecord的默认上下文作为父级。每个上下文都会观察到其他上下文的变化所有上下文都是在主线程上创建和使用的,所以看起来这个问题与多线程问题无关。
当我尝试在支持上下文中创建对象并在对象创建后立即持续更改支持上下文时一切正常。在创建后立即删除新创建的对象时会出现问题 - 收到EXC_BAD_ACCES。 但是,实体正在持久保存,并且在下次启动时,可以使用和删除实体而不会出现同步问题。
1注意:当通过existingManWithID: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文档中的更改管理部分不提供任何内容。同样的结果给了谷歌。
答案 0 :(得分:0)
不要那样做。观看另一个观看观察者的情境......这很糟糕。首先需要了解嵌套上下文的规则以及数据如何在保存时从一个流向另一个。
我是你的情况,你可能想在NSMOC上寻找MR_confinementContext方法。这将创建一个使用旧线程限制模型的上下文。这可以帮助您解决线程崩溃问题。但首先,不要在
中进行循环观察......数据流动