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 线程的主要内容,如果未能解决你的问题,请参考以下文章