1

NSOperationQueue有一套NSOperationQueueDefaultMaxConcurrentOperationCount。它充满了NSOperation物体(到目前为止没有什么奇怪的)。我将其子类化NSOperation以执行一些后台任务。

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

    [NSEntityDescription insertNewObjectForEntityForName:@"Channel" inManagedObjectContext:context];

  4. 将其与上下文一起保存。

    [managedObjectContext 保存:&错误]

我喜欢这一切都在后台发生,这样 UI 就不会被阻塞。我读了这篇关于核心数据并发的文章,据我所知。最好的方法是在 each 中创建一个新NSManagedObjectContextNSOperation,但共享相同的持久存储协调器。

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

  1. 如果我在 NSOperationQueue 中运行不同的操作,这些操作是否会在保存托管对象上下文时相互干扰?还是等到保存完成才执行下面的操作?

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

我希望有人能对这件事有所了解,因为我现在真的很困。

4

1 回答 1

1

您需要执行以下操作:

  1. 为每个 NSOperation 创建一个托管对象上下文。在 main 方法上创建这个新的上下文,因为这是它在正确的线程上执行的时候。
  2. 分配上下文持久存储协调器。
  3. 创建一个观察者来接收 NSManagedObjectContextDidSaveNotification。这是在对 NSOperation 的上下文进行更改时主要上下文知道的唯一方式。确保在合并上下文所在的线程/块上进行合并调用。如果要与主线程的上下文进行合并,请使用来自 NSOperation 上下文的通知在主线程上调用 mergeChangesFromContextDidSaveNotification: 方法。

另外,问问自己是否真的想让所有这些操作同时工作。根据文档:

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

您无法控制同时运行的 NSOperations 数量。如果这不是您想要的,考虑到您将锁定数据库以进行保存这一事实,并且还因为您有网络,您可能会更好地使用串行 NSOperationQueue (maxConcurrentOperation=1)也做了。

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

于 2012-08-13T14:09:07.390 回答