2

我正在编写基于CoreData的iPad烹饪应用程序。 在我的应用我有一个屏幕,与2种信息编辑配方:mergeChangesFromContextDidSaveNotification中同步上下文时的核心数据崩溃(EXC_BAD_ACCESS)

  1. 列出与处方类\子类别和国家
  2. 所有其他配方相关的信息

每个这份名单可能会在popover中编辑。这个列表的变化应该立即坚持(即如果用户将某些配方类别添加到可能的类别列表中,但取消了配方创建,则该类别应可用于所有配方)。 它descided实施2个独立的NSManagedObjectContexts处理每种类型的信息的:主要方面用于配方管理和支持方面的名单。

通过MagicalRecord框架执行的所有核心数据操作。这两个上下文都有MagicalRecord的默认上下文作为父项。每个上下文都观察另一个上下文的变化。所有上下文正在创建和使用主线程因此,似乎这个问题没有任何关系到多线程问题。

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

1注意:当从访问对象时通过existingObjectWithID主要内容:NSManagedObjectContext的方法可以删除此对象。然而,崩溃发生在主要上下文(Main和Supporting上下文的父上下文)上。

这里是我的代码:

实体创建:

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]; 

请咨询什么情况CAU这个问题,因为现在我很困惑,即使我应该采取哪种行动来解决这个问题。核心数据文档中的更改管理部分没有提供任谷歌同样的结果。

问候,Ilia。

回答

0

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

我的情况是,您可能需要查找NSMOC上的MR_confinementContext方法。这将创建使用旧线程约束模型的上下文。这可能有助于避免线程崩溃。但首先,不要做圆形观察...数据流在

+0

我删除了环境观察的上下文。现在只有主要的手表支持变化。但是这并没有帮助,崩溃仍然存在。顺便说一句我发现这个问题的一些解决方法:如果对于我的上下文(主要和支持),我将父母设置为MR_rootSavingContext一切都开始工作正常。但是,似乎它不会成为我使用它的解决方案,因为还需要iCloud支持,MR_defaultContext是负责这一点的人员。 – 2013-02-27 14:06:01

+0

您还指出了嵌套上下文的规则以及数据如何相互流动的方式 - 请您指出一些文章?在谷歌搜索大多数给我有关核心数据多线程问题的文章。 – 2013-02-27 14:12:51

+0

不幸的是,现在最好的文档是关于核心数据的WWDC视频。你应该可以通过一个基本的苹果开发者账户进行检查。我仍然会避免使用核心数据来支持iCloud ......这对他们来说是相当糟糕的...... – casademora 2013-02-27 15:13:48