我可以拥有多个NSOperation正在访问的单个Private Managed Object上下文吗?具有多个NSOperation的核心数据
我有2种两个选择:
有每一个的NSOperation管理对象上下文。 即,如果有100个NSoperation 100会创建上下文。
有一个上下文和多个NSOperation。
即单个上下文和100个NSOperations访问它。
哪个可以是更好的选择。
我可以拥有多个NSOperation正在访问的单个Private Managed Object上下文吗?具有多个NSOperation的核心数据
我有2种两个选择:
有每一个的NSOperation管理对象上下文。 即,如果有100个NSoperation 100会创建上下文。
有一个上下文和多个NSOperation。
即单个上下文和100个NSOperations访问它。
哪个可以是更好的选择。
更正解决方案是选项1.创建一个并发计数为1的队列,并使用队列进行所有写入。这将避免任何可能导致信息丢失的写入冲突。如果您需要访问主线程的信息,您应该使用全局主线程上下文(在NSPersistentContainer中调用viewContext
)。
如果这会变慢,那么你应该调查你正在做的工作。一般来说,每个操作都应该很快,所以如果你发现它们不是你,你可能会做一些错误的事情(一个常见的问题是对每个导入的对象进行一次抓取 - 而不是一次大的抓取)。另一种解决方案是将大型任务分成几个较小的任务(导入大量数据)。您还可以设置不同的优先级 - 给予用户启动的操作更高的优先级。
您不应该害怕创建上下文。他们并不昂贵。
根据您在评论中所说的话,您并未真正在单个操作中写入大量数据,而只是为对象提取了一个对象,我建议使用单个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
你是什么NSOperationQueue的maxConcurrentOperationCount任何并发问题,这样的方式?你的NSOperations可以同时执行吗?单个NSOperation完成的工作量(在要保存的对象数量或在几秒钟内完成其工作)是多少? – Sander
1. maxConcurrentOperationCount目前保持默认。 2.通过单个NSOperation完成的工作量是多少: - 从核心数据中获取单个对象,然后与基于该对象的服务器对象进行比较,然后根据该对象和文件上载或下载并写入磁盘。 – user3519594
正如您所描述的那样,您不会在一次操作中将大量新数据保存到CoreData中。所以你可以有单一的上下文,并从中获取任何对象。为了避免并发问题,你可以使用performAndWait函数。 – Sander