保存上下文形式Core Data的线程安全方法是什么?

时间:2012-08-12 18:56:30

标签: xcode multithreading core-data nsmanagedobject nsoperation

我将NSOperationQueue设置为NSOperationQueueDefaultMaxConcurrentOperationCount。它充满了NSOperation个对象(到目前为止并不奇怪)。我将NSOperation子类化为一些后台任务。

  1. 从互联网上下载数据。
  2. 解析数据,以便我可以阅读。
  3. 创建NSManagedObject:

    [NSEntityDescription insertNewObjectForEntityForName:@“Channel”inManagedObjectContext:context];

  4. 使用上下文保存。

    [managedObjectContext save:& error]

  5. 我喜欢这一切都发生在后台,因此UI不会被阻止。我读了this article about concurrency with core data,据我所知。最好的方法是在每个NSManagedObjectContext中创建一个新的NSOperation,但共享同一个持久性存储协调器。

    然而,这很容易实现,当它保存文档中所说的上下文时,它容易出错。所以我的问题如下:

    1. 如果我在NSOperationQueue中运行了不同的操作,那么这些操作在保存托管对象上下文时是否会相互干扰?或者是否等待执行以下操作直到保存完成?

    2. 我可以安全地在NSOperation中保存上下文吗?或者这是不是很糟糕的做法?

    3. 我希望有人可以对这件事情发表意见,因为我现在真的陷入困境。

1 个答案:

答案 0 :(得分:1)

您需要做的是:

  1. 为每个NSOperation创建一个托管对象上下文。 在主方法上创建这个新上下文,因为这是在正确的线程上执行的时候。
  2. 分配上下文持久性存储协调器。
  3. 创建一个观察者以接收NSManagedObjectContextDidSaveNotification 。这是主要背景在NSOperation背景下进行变更时所知道的唯一方式。 确保合并调用是在合并上下文的线程/块中进行的。如果要与主线程的上下文合并,请使用NSOperation上下文中的通知在主线程上调用mergeChangesFromContextDidSaveNotification:方法。
  4. 另外,问问自己是否真的希望所有这些操作同时工作。根据文件:

      

    默认的最大操作数由NSOperationQueue对象根据当前系统条件动态确定。

    您无法控制同时运行的NSOperations数量。如果这不是你想要的,你可能会更好,如果你只是使用序列号NSOperationQueue(maxConcurrentOperation = 1),考虑到你要锁定数据库来进行保存,还因为你有网络连接完成了。

    如果采取上述预防措施,您可以安全地保存在NSOperation的主要方法内。