这两种方法有什么区别?
container.performBackgroundTask { (context) in
// ... do some task on the context
// save the context
do {
try context.save()
} catch {
// handle error
}
}
和
let context = persistentContainer.newBackgroundContext()
context.perform {
// ... do some task on the context
// save the context
do {
try context.save()
} catch {
// handle error
}
}
何时使用第一种方法,何时使用第二种方法?
最佳答案
区别在于如何处理并发。
用performBackgroundTask
...
container.performBackgroundTask { (context) in
// ... do some task on the context
}
容器创建一个新的后台上下文来执行任务。该函数会立即返回,因此,如果在任务完成之前再次调用它,则两个任务可能会同时运行。
用
newBackgroundContext
...let context = persistentContainer.newBackgroundContext()
context.perform {
// ... do some task on the context
}
您创建一个新的上下文,并在后台执行一些操作。如果您在相同的上下文中再次调用
context.perform
,则新的闭包也将在后台运行。但是由于上下文是相同的,因此第二个要等到第一个完成后才能开始。归结为,第一个可以同时运行许多背景上下文,而第二个可以更轻松地确保只有一个上下文。
第一个选项可以同时执行更多后台任务,这可能很好,但也可能意味着多个调用具有冲突的更改。第二个选项序列化了后台任务,并且由于它们不是同时运行的,因此不会相互冲突。哪个更好取决于您在闭包中执行的操作。
关于ios - CoreData : What's the difference between performBackgroundTask and newBackgroundContext()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53633366/