NSOperation 和 CoreData 线程

Posted

技术标签:

【中文标题】NSOperation 和 CoreData 线程【英文标题】:NSOperation and CoreData Threading 【发布时间】:2009-11-12 20:22:06 【问题描述】:

我正在使用 NSOperationQueue 的两个线程之间传递一些 NSManagedObject 数据,并发级别最高为 1,我想要一些关于我是否正确执行此操作的建议。

由于 NSManagedObject 不是线程安全的,我通过 NSOperation 派生类将 NSManagedObjectID 从 ThreadA(主线程)发送到 ThreadB。一般工作流程:

ThreadA(主线程):

创建 NSPersistentStoreCoordinator

创建主 NSManagedObjectContext(1)

创建 NSManagedObjectContext(2) 以在 workerThread 中使用

创建 MyNSOperationItem,传递 NSManagedObjectContext 并将 MyNSOperationItem 添加到 NSOperationQueue

ThreadB(NSOperationQueue 的线程):

NSOperation 派生类将从持久化中检索数据 使用提供的 objectID 存储。

我的 NSOperation 类如下所示:

@interface MyNSOperationItem: NSOperation

    // MyNSOperationItem is created in thread1 and MOC will be 
    // set on creation
    NSManagedObjectContext   *threadedMOC;
   
    NSManagedObjectID        *workItemObjectID;

@end

那么我的 NSOperation 派生类可以引用 NSManagedObjectContext 还是应该将第二个 NSManagedObjectContext 存储在其他地方?由于这是一个队列,因此将创建多个 MyNSOperationItem 实例,每个实例都指向同一个 NSManagedObjectContext。

【问题讨论】:

【参考方案1】:

我认为这应该可以满足您的所有需求:

http://developer.apple.com/mac/libra...reData/Articles/cdMultiThreading.html

如果您需要将 fetch 卸载到后台线程,这里是我上面引用的文档中的一个小提示:

在后台线程中获取

最简单的多线程之一 可以与 Core Data 一起使用的技术 提高应用程序响应能力 是在一个 后台线程。 (请注意,这 技术只有在你是 使用 SQLite 存储,因为数据来自 二进制和 XML 存储被读入 内存立即打开。)这 意味着如果提取很复杂 或者返回大量数据,你 可以将控制权返回给用户,并且 在结果到达时显示结果。为 有关如何执行此操作的示例,请参阅 BackgroundFetching 中的示例 /Developer/Examples/CoreData/.

您使用两个托管对象上下文 与单个持久性相关联 店铺协调员。你取一个 背景上的托管对象上下文 线程,并传递对象的 ID 将对象提取到另一个线程。在 第二个线程(通常是 应用程序的主线程,这样你 然后可以显示结果),您使用 对象故障的第二个上下文 使用这些对象 ID(您使用 objectWithID: 实例化 对象)。

【讨论】:

该链接在“/Developer/Examples/CoreData”中引用了一个名为“BackgroundFetching”的示例应用程序——我的机器上不存在这样的目录。关于在哪里可以找到该样本的任何想法? 是的。你是对的。而且它似乎也不再在开发站点上可用。不知道这笔交易是什么。您可以向 Apple 提交文档错误,指出过时信息。也许他们会用新的路径或链接更新它。再说一次,也许他们会更新它并完全删除路径/链接。对此感到抱歉。

以上是关于NSOperation 和 CoreData 线程的主要内容,如果未能解决你的问题,请参考以下文章

Coredata 并发问题

NSOperation(s) 仅在 iOS 3 设备上泄漏

iOS多线程---NSOperation介绍和使用

ios多线程 -- NSOperation 简介

iOS开发多线程篇 09 —NSOperation简单介绍

多线程 NSOperation