【问题标题】:core data with multiple NSOperation具有多个 NSOperation 的核心数据
【发布时间】:2017-10-28 09:00:45
【问题描述】:

我可以拥有一个由 Multiple NSOperation 访问的私有托管对象上下文吗?

我有 2 两个选项:

  1. 每个 NSOperation 都有一个托管对象上下文。 即如果有 100 个 NSoperation 100 上下文将被创建。

  2. 拥有一个上下文和多个 NSOperation。

即单个上下文和 100 个访问它的 NSOperations。

这可能是一个更好的选择。

【问题讨论】:

  • 你的 NSOperationQueue 的 maxConcurrentOperationCount 是多少?您的 NSOperations 可以同时执行吗?单个 NSOperation 完成的工作量是多少(要保存的对象数量或完成工作的秒数)?
  • 1. maxConcurrentOperationCount 当前保持默认值。 2. 单个 NSOperation 完成的工作量是多少:- 与服务器对象相比,从核心数据中获取单个对象,然后基于该对象和文件上传或下载并写入磁盘。
  • 正如您所描述的,您不会在单个操作中将一堆新数据保存到 CoreData 中。因此,您可以拥有单个上下文并从中获取任何对象。为避免并发问题,您可以使用 performAndWait 函数。
  • 好的,谢谢 Sander,所以你建议我可以选择 2 个选项。许多人建议选择选项 1,包括 Marcus Zarra,从不共享 2 个线程和子上下文之间的上下文很便宜。使用一次,然后扔掉。我觉得这有点过头了,因为我一次只处理一个对象。我仍然无法决定更好的解决方案。任何人都可以遮光,以防我误解了
  • 好的,我会在下面发布我的答案,以便您仔细查看。

标签: ios objective-c core-data nsmanagedobjectcontext nsoperation


【解决方案1】:

更正解决方案是选项 1。创建一个并发计数为 1 的队列,并使用该队列完成所有写入操作。这将避免任何可能导致信息丢失的写冲突。如果您需要访问主线程的信息,您应该使用全局主线程上下文(在 NSPersistentContainer 中调用 viewContext)。

如果这会变慢,那么您应该调查您正在做的工作。一般来说,每个操作都应该很快,所以如果你发现它们不是你可能做错了什么(一个常见的问题是为每个导入的对象进行提取 - 而不是一次大提取)。另一种解决方案是将大型任务拆分为几个较小的任务(导入大量数据)。您还可以设置不同的优先级 - 为用户发起的操作赋予更高的优先级。

您不应该害怕创建上下文。它们并没有那么贵。

【讨论】:

    【解决方案2】:

    根据您在 cmets 中所说的,您实际上并没有在单个操作中写入大量数据,只是对对象进行了提取,我建议使用单个 MOC

    拥有多个MOC 的通常原因是独立于Main context 和任何其他上下文来读取/更新/保存大量数据。在这样的流程中,您将能够同时从不同的上下文中保存这些对象。

    但这不是你的情况,如果我理解正确的话。

    对于单次提取,只有一个Private context 就足够了,但是我相信在创建许多上下文时不会有太多开销。但是为什么要做额外的工作呢?

    1.所以,你创建私有 MOC

    let privateContext = NSManagedObjectContext(concurrencyType:.privateQueueConcurrencyType)
    

    2.创建每个操作并通过MOC

    let operation = MyOperation(context: privateContext)
    

    3.在操作中使用函数对私有MOC进行同步调用。 这样,您应该避免单个 MOC 的任何并发问题

    func performAndWait(_ block: @escaping () -> Swift.Void)
    

    例如

    let myObject: Object?
    privateContext.performAndWait {
         myObject = privateContext.fetch(...)
    }
    // do what you need with myObject
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      相关资源
      最近更新 更多