CoreData:performBackgroundTask和newBackgroundContext()之间有什么区别?

swa*_*ner 3 core-data ios swift

这两种方法有什么区别?

container.performBackgroundTask { (context) in 
    // ... do some task on the context

    // save the context
    do {
        try context.save()
    } catch {
        // handle error
    }
}
Run Code Online (Sandbox Code Playgroud)

let context = persistentContainer.newBackgroundContext()
context.perform {
    // ... do some task on the context

    // save the context
    do {
        try context.save()
    } catch {
        // handle error
    }
}
Run Code Online (Sandbox Code Playgroud)

何时使用第一种方法和何时使用第二种方法?

Tom*_*ton 13

区别在于如何处理并发.

performBackgroundTask...

container.performBackgroundTask { (context) in 
    // ... do some task on the context
}
Run Code Online (Sandbox Code Playgroud)

容器创建新的背景上下文以执行任务.此函数立即返回,因此如果在任务完成之前再次调用它,则两个任务可以同时运行.

newBackgroundContext...

let context = persistentContainer.newBackgroundContext()
context.perform {
    // ... do some task on the context
}
Run Code Online (Sandbox Code Playgroud)

您创建一个新的上下文并在后台执行一些操作.如果context.perform再次调用相同的上下文,则新的闭包也会在后台运行.但由于它是相同的上下文,第二个在第一个完成之前不会开始.

它归结为第一个可以有许多背景上下文同时工作,而第二个可以更容易确保只有一个.

第一个选项可以有更多同时的后台任务,这可能是好的,但也可能意味着多个调用具有冲突的更改.第二个选项序列化后台任务,因为它们不会同时运行,所以它们不会相互冲突.哪个更好取决于你在闭包中做了什么.