0

我可以拥有多个NSOperation正在访问的单个Private Managed Object上下文吗?具有多个NSOperation的核心数据

我有2种两个选择:

  1. 有每一个的NSOperation管理对象上下文。 即,如果有100个NSoperation 100会创建上下文。

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

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

哪个可以是更好的选择。

+0

你是什么NSOperationQueue的maxConcurrentOperationCount任何并发问题,这样的方式?你的NSOperations可以同时执行吗?单个NSOperation完成的工作量(在要保存的对象数量或在几秒钟内完成其工作)是多少? – Sander

+0

1. maxConcurrentOperationCount目前保持默认。 2.通过单个NSOperation完成的工作量是多少: - 从核心数据中获取单个对象,然后与基于该对象的服务器对象进行比较,然后根据该对象和文件上载或下载并写入磁盘。 – user3519594

+0

正如您所描述的那样,您不会在一次操作中将大量新数据保存到CoreData中。所以你可以有单一的上下文,并从中获取任何对象。为了避免并发问题,你可以使用performAndWait函数。 – Sander

回答

0

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

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

您不应该害怕创建上下文。他们并不昂贵。

0

根据您在评论中所说的话,您并未真正在单个操作中写入大量数据,而只是为对象提取了一个对象,我建议使用单个MOC

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

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

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

1.So,为您打造私人MOC

let privateContext = NSManagedObjectContext(concurrencyType:.privateQueueConcurrencyType) 

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

let operation = MyOperation(context: privateContext) 

3.In操作执行与功能的私人MOC同步调用。 在你应该避免使用单MOC

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

例如

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