NSOperation和CoreData线程

时间:2009-11-12 20:22:07

标签: iphone objective-c multithreading core-data

我使用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。

1 个答案:

答案 0 :(得分:5)

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

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

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

  

在后台线程中获取

     

最简单的多线程之一   您可以使用Core Data的技术   提高应用程序响应能力   是在a上执行获取请求   背景线程。 (注意这个   技术只有你自己才有用   使用SQLite存储,因为数据来自   读入二进制和XML存储   记忆立即打开。)这个   意味着如果获取很复杂   或者返回大量数据   可以将控制权返回给用户和   到达时显示结果。为   如何执行此操作的示例,请参阅   BackgroundFetching示例   /开发人员/实施例/ CoreData /.

     

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