NSOperation和CoreData线程

Ale*_*ove 5 iphone multithreading core-data objective-c

我使用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
Run Code Online (Sandbox Code Playgroud)

那么我的NSOperation派生类是否可以引用NSManagedObjectContext或者我应该将第二个NSManagedObjectContext存储在其他位置?由于这是一个队列,因此将创建许多MyNSOperationItem实例,每个实例都指向相同的NSManagedObjectContext.

Mat*_*ong 5

我认为这应该给你所需要的一切:

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

如果您需要将fetch卸载到后台线程,请参阅上面引用的文档中的一点提示:

在背景线程中获取

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

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