CoreData 和 NSManagedObject 上下文 - 私有与主

Posted

技术标签:

【中文标题】CoreData 和 NSManagedObject 上下文 - 私有与主【英文标题】:CoreData and NSManagedObject Context - private vs. main 【发布时间】:2016-07-02 23:27:57 【问题描述】:

使用 performBlock 触发具有私有上下文的 CoreData (CRUD) 操作与使用 dispatch_async 后台队列中的主上下文触发此类操作之间有区别吗?

难道不应该在后台线程中使用主上下文吗?

苹果文档的链接是here。

【问题讨论】:

【参考方案1】:

您应该从不在后台线程中使用主队列上下文。这违反了线程限制规则。

主队列上下文只能从主队列(UI 队列/线程)或performBlock 访问。如果您需要执行与 UI 无关的任务,那么您应该创建一个私有队列上下文并通过 performBlock 访问它。

要确认您的核心数据线程正确,您可以打开-com.apple.CoreData.ConcurrencyDebug 1 运行时设置。

【讨论】:

我明白了。但是,我测试了这两个选项,它们似乎都有效。所以我的问题是,这是否只是运气,禁止的方法有效...... 这是一个线程违规,这意味着它会在大部分的时间里工作,然后在生产中失败,数据损坏的风险很高。这就是存在调试设置的原因;因为线程错误不会始终如一地出现。

以上是关于CoreData 和 NSManagedObject 上下文 - 私有与主的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 使用 CoreData 的 dispatch_async 保留周期

删除时如何手动管理Core Data关系

@dynamic 使用的常见情况是啥?

如何列出 NSManagedObject 的变量

CoreData父、母子关系,一个CoreData子类可以和两个子类有相同的关系吗?

CoreData 和 NSComboBox