这两种方法有什么区别?
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
}
}
何时使用第一种方法,何时使用第二种方法?
答案 0 :(得分:6)
不同之处在于并发处理方式。
使用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
,则新的闭包也将在后台运行。但是由于上下文相同,因此第二个要等到第一个完成后才能开始。
归结为,第一个可以同时运行多个背景上下文,而第二个可以更轻松地确保只有一个背景。
第一个选项可以同时执行更多后台任务,这可能很好,但也可能意味着多个调用的更改有冲突。第二个选项序列化了后台任务,并且由于它们不是同时运行的,因此不会相互冲突。哪个更好取决于您在闭包中执行的操作。
答案 1 :(得分:0)
没有详细的答案,但有所不同
为避免阻塞用户界面,您不应将主视图上下文用于耗时的任务。创建私有托管对象上下文并在后台执行任务
container.performBackgroundTask->它将为您创建临时私有上下文,并执行一个代码块
和
persistentContainer.newBackgroundContext->您还可以获取一个新的私有上下文以使用您认为合适的任何方式:
来源https://useyourloaf.com/blog/easier-core-data-setup-with-persistent-containers/