【问题标题】:What would be a thread-safe way to save a context form Core Data?什么是保存上下文表单 Core Data 的线程安全方式?
【发布时间】:2012-08-12 18:56:29
【问题描述】:

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

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

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

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

    [managedObjectContext 保存:&错误]

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

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

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

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

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

【问题讨论】:

    标签: xcode multithreading core-data nsmanagedobject nsoperation


    【解决方案1】:

    你需要做的是:

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

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

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

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

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

    【讨论】:

    • 非常感谢您花时间编写此说明,非常感谢。这对我来说非常复杂。我会调查你的答案。
    • 我知道 maxConcurrentOperation==1 给了我更多的控制权,但是某些 URL 的加载速度可能比其他 URL 更快,并且使用 NSOperationQueueDefaultMaxConcurrentOperationCount 我相信我会尽可能快地获取数据。
    • 您可以在 NSOperation 内部有一个串行调度队列,由这些 NSOperation 实例共享,并使用该队列来处理数据库保存。请注意,为了使用核心数据安全地正确处理数据,您必须创建 NSManagedObjectContext 并在传递给串行队列的块内执行 NSEntityDescription 插入调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多