Core Data 3 托管对象上下文

Posted

技术标签:

【中文标题】Core Data 3 托管对象上下文【英文标题】:Core Data 3 Managed Object Contexts 【发布时间】:2013-11-08 23:55:42 【问题描述】:

在我的 ios 应用程序中,我有一个后台线程和主线程的托管对象上下文。问题是我获取某个实体的核心数据调用可能需要大约 3-5 秒,并且保留在主线程上会很糟糕,但是当我将它放在单独的托管对象上下文的后台线程上时,只是为了检索数据仅用于在后台检索数据的后台线程我遇到了死锁。

我的问题是:有没有办法可以在后台线程中使用多个托管对象上下文?我现在正在做的事情是否应该有效,而我只是在某处做错了事,比如在上下文之间传递对象(我已经检查过我没有看到任何东西)?

【问题讨论】:

【参考方案1】:

托管对象上下文不是线程安全的,因此如果您需要对 Coredata 对象进行任何类型的后台工作(即长时间运行的导入/导出功能而不阻塞主 UI),您将希望在后台执行此操作线程。

在这些情况下,您需要在后台线程上创建一个新的托管对象上下文,遍历您的 coredata 操作,然后通知主上下文您的更改。

See Example Here

苹果文档:

使用线程限制来支持并发

推荐使用 Core Data 进行并发编程的模式是 线程限制:每个线程必须有自己的完全私有的 托管对象上下文。

采用该模式有两种可能的方式:

为每个线程创建一个单独的托管对象上下文并共享一个 单个持久存储协调器。这是通常推荐的 接近。

创建单独的托管对象上下文和持久存储 每个线程的协调员。这种方法提供了更大的 以更大的复杂性为代价的并发性(特别是如果您 需要沟通不同上下文之间的变化)和增加 内存使用情况。

【讨论】:

我明白这一点,我已经这样做了,但问题是我不仅需要在后台编辑数据,还需要检索,所以我想知道是否可以有多个线程上的托管对象上下文? 根据苹果指南,您应该为每个线程创建一个 MOC。您可以将同一个 MOC 用于多种用途。此外,就 MOC 创建和使用而言,永远不要跨越线程边界。用一些 Apple 文档编辑了我的答案。 好的,但是同时在同一个托管对象上下文中保存和检索数据不是问题吗?

以上是关于Core Data 3 托管对象上下文的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 托管对象上下文线程同步

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

使用Core Data将文本从文本字段分配到托管对象上下文

如果您想通过 Core Data 使用多个实体,您需要为每个实体提供一个托管对象上下文吗?

在 Core Data 中执行子获取时,在父上下文中修改托管对象是不是会向下传播到子上下文?

KVO 和 Core Data - 自观察托管对象