在我的iOS应用程序中,我有后台线程和主线程的托管对象上下文。问题是我的核心数据调用获取某个实体可能需要大约3-5秒,并且保持主线程可能会很糟糕但是当我把它放在单独的托管对象上下文的后台线程上时,只是为了检索数据用于在后台检索数据的后台线程我遇到了死锁。
我的问题是:有没有办法可以在后台线程中使用多个托管对象上下文?我现在正在做什么工作,我只是在某些地方做错了,比如在上下文之间传递对象(我已经检查过,我没有看到任何东西)?
答案 0 :(得分:2)
托管对象上下文不是线程安全的,因此如果您需要使用Coredata对象进行任何后台工作(即长时间运行的导入/导出功能而不阻塞主UI),您将需要在后台执行此操作线程。
在这些情况下,您需要在后台线程上创建一个新的托管对象上下文,遍历您的coredata操作,然后通知您的更改的主要上下文。
Apple文档:
使用线程限制来支持并发
建议使用Core Data进行并发编程的模式是 线程限制:每个线程必须有自己的完全私有 托管对象上下文。
采用这种模式有两种可能的方法:
为每个线程创建一个单独的托管对象上下文并共享一个 单个持久性存储协调器。这是通常推荐的 方法
创建单独的托管对象上下文和持久性存储 每个线程的协调员。这种方法提供了更多 并发性以牺牲更大的复杂性为代价(特别是如果你 需要在不同的上下文之间传递变化)并增加 内存使用情况。