【问题标题】:Using fetch requests on background threads with Core Data在 Core Data 的后台线程上使用 fetch 请求
【发布时间】:2012-03-07 23:35:27
【问题描述】:

我想将一个ManagedObjectContext 用于主线程,另一个用于使用NSOperation 的后台线程,正如Apple 建议的那样。而且,每个ManagedObjectContext 共享相同的持久存储。

获取可能发生在主线程上,因为我使用 Core Data 来填充表格视图。

在后台,我需要访问存储图像名称的NSManagedObject 属性。然后,后台线程会创建并缓存这些图片,这也是拥有后台线程的主要原因。

鉴于此,如果两个线程都尝试访问持久性存储,是否存在任何危险(如锁定),因为它们可能同时从其中获取数据?

【问题讨论】:

    标签: iphone ios multithreading core-data nsoperation


    【解决方案1】:

    每个线程都需要自己的托管对象上下文,但所有线程都需要共享一个持久存储协调器 - 这将解决您所描述的潜在问题。在Core Data Concurrency Programming Guide 中查看更多信息。

    【讨论】:

      【解决方案2】:

      两个不同的 MOC 可以同时访问同一个 PSC 进行读取。

      但是对于写入,如果有可能并发写入,您需要 lockunlock 您的持久存储协调器。

      【讨论】:

      • 确定吗?我还没有在苹果文档中读到任何关于它的内容。你能指出我的来源吗?
      • 我从未在文档中找到它。这是来之不易的经验和一些漫长的调试过程。如果您让两个不同的线程不断写入同一个 NSPSC,那么重现就很容易了
      • 我在文档中也找不到它,但是在测试时,似乎有 2 个不同的 MOC 可以同时从持久存储中读取数据。
      【解决方案3】:

      只要每个线程都使用自己的NSManagedObjectContext,让它们共享NSPersistentStoreCoordinator 是绝对安全的。 NSManagedObjectContext 将根据需要处理对持久存储的所有适当锁定。但是,您必须小心不要在线程之间共享NSManagedObjects。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多