我使用NSOperationQueue在两个线程之间传递一些NSManagedObject数据,并发级别最大为1,我想对是否正确执行此操作提出一些建议。
由于NSManagedObject不是线程安全的,我通过NSOperation派生类将Threadman(主线程)的NSManagedObjectID发送到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。
答案 0 :(得分:5)
我认为这应该可以满足您的所有需求:
http://developer.apple.com/mac/libra...reData/Articles/cdMultiThreading.html
如果您需要将fetch卸载到后台线程,请参阅上面引用的文档中的一点提示:
在后台线程中获取
最简单的多线程之一 您可以使用Core Data的技术 提高应用程序响应能力 是在a上执行获取请求 背景线程。 (注意这个 技术只有你自己才有用 使用SQLite存储,因为数据来自 读入二进制和XML存储 记忆立即打开。)这个 意味着如果获取很复杂 或者返回大量数据 可以将控制权返回给用户和 到达时显示结果。为 如何执行此操作的示例,请参阅 BackgroundFetching示例 /开发人员/实施例/ CoreData /.
您使用两个托管对象上下文 与单个持久性相关联 商店协调员。你拿一个 在背景上管理对象上下文 线程,并传递的对象ID 将对象提取到另一个线程。在 第二个线程(通常是 应用程序的主线程,以便你 你可以使用,然后显示结果) 对象中的错误的第二个上下文 使用这些对象ID(您使用 objectWithID:实例化 对象)。