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