NSOperation和CoreData线程处理

5
我正在使用NSOperationQueue将一些NSManagedObject数据在两个线程之间传递,同时并发级别最大为1,并希望您能就我是否正确地执行此操作提出建议。
由于NSManagedObject不是线程安全的,因此我通过一个继承自NSOperation的类从ThreadA(主线程)向ThreadB发送NSManagedObjectID。一般的工作流程如下:
ThreadA(主线程): - 创建NSPersistentStoreCoordinator - 创建主NSManagedObjectContext(1) - 为workerThread创建NSManagedObjectContext(2) - 创建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个回答

5

我认为这应该给你所有需要的东西:

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

如果您需要将获取数据的操作转移到后台线程中,这里有一个小技巧来自我上面提到的文档:

在后台线程中抓取

使用核心数据(Core Data)可以使用的最简单的多线程技术之一,以提高应用程序响应能力就是在后台线程上执行抓取请求。(请注意,仅当您使用SQLite存储时,此技术才有用,因为二进制和XML存储的数据会立即读入内存。)这意味着如果抓取是复杂的或返回大量数据,则可以将控制权返回给用户并在结果到达时显示结果。有关如何执行此操作的示例,请参见/Developer/Examples/CoreData/中的BackgroundFetching示例。

您需要使用与单个持久性存储区协调器相关联的两个托管对象上下文。您在后台线程上在一个托管对象上下文中进行抓取,并将获取的对象的对象ID传递到另一个线程。在第二个线程中(通常是应用程序的主线程,以便您可以显示结果),您使用第二个上下文来使用这些对象ID来获取对象(您使用objectWithID:来实例化该对象)。


该链接引用了一个名为“BackgroundFetching”的示例应用程序,位于“/Developer/Examples/CoreData”目录下 - 但我的计算机上不存在这样的目录。有没有找到该示例的想法? - Alexi Groove
是的。你说得对。而且在开发者网站上似乎也不再提供了。不确定怎么回事。你可以向苹果提交一个文件文档错误,指出过时的信息。也许他们会用新的路径或链接更新它。然而,也可能他们会更新并完全删除路径/链接。对此很抱歉。 - Matt Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接