父 NSManagedObjectContext 在子保存后没有变化,但仅在发布模式下(在调试模式下工作)

Posted

技术标签:

【中文标题】父 NSManagedObjectContext 在子保存后没有变化,但仅在发布模式下(在调试模式下工作)【英文标题】:Parent NSManagedObjectContext has no changes after child is saved, but only in release mode (works in debug mode) 【发布时间】:2013-03-27 00:39:35 【问题描述】:

我的设置:

一个NSManagedObjectContext,类型为NSPrivateQueueConcurrencyType,连接到我的NSPersistentStoreCoordinator NSManagedObjectContext 类型为 NSMainQueueConcurrencyType,它是私有上下文的子级。 NSManagedObjectContext 类型为 NSConfinementConcurrencyType,它是主上下文的子级。

从服务器下载数据时,我将数据写入NSConfinementConcurrencyType 类型的上下文。然后我保存这个上下文,它将更改推送到我的主要上下文。然后我保存我的主要上下文,它将更改推送到我的私人上下文。此时,我在私有上下文中使用performBlock 方法将所有内容保存到我的持久存储中。

这在设备上调试时可以完美运行。每当我归档应用程序并在发布模式下运行应用程序时,我的主上下文永远不会收到更改,即使我成功保存了它的子上下文。我已经仔细检查了,我的临时上下文确实链接到主上下文(主上下文确实显示为临时上下文的父级)。但是每当我在发布模式下保存临时上下文时,主上下文永远不会显示任何更改。我很困惑为什么这会在调试模式下工作而不是在发布模式下工作。

任何建议/帮助将不胜感激。

谢谢,

帅气

编辑:如果我使用调试配置存档构建,一切都按预期工作。因此,发布配置中有一些不同的设置。我会报告我的发现。

编辑 2:找到罪魁祸首。所以我将我的保存上下文调用包装在一个 NSAssert 中(希望在测试时发现任何失败)。不幸的是,Release 配置删除了这些包含我的保存调用的断言块。 掌心

【问题讨论】:

【参考方案1】:

NSConfinementConcurrencyType 是旧的遗留核心数据行为,在父和子上下文的概念之前。如果您要导入子上下文,则该子上下文必须是NSPrivateQueueConcurrencyType。我很惊讶 performBlock:、父/子 MOC 和 NSConfinementConcurrencyType 的组合完全有效。

【讨论】:

奇怪的是,也将其更改为 NSPrivateQueueConcurrencyType ,但它仍然无法正常工作。与问题中所述的行为相同。

以上是关于父 NSManagedObjectContext 在子保存后没有变化,但仅在发布模式下(在调试模式下工作)的主要内容,如果未能解决你的问题,请参考以下文章

保存父 NSManagedObjectContext 时出错

父 NSManagedObjectContext 必须使用 NSPrivateQueueConcurrencyType 或 NSMainQueueConcurrencyType

在子 NSManagedObjectContext 中创建与父实体有关系的实体

父 NSManagedObjectContext 在子保存后没有变化,但仅在发布模式下(在调试模式下工作)

取消 NSManagedObjectContext performBlock

子父上下文保存冲突