这两种方法有什么区别?

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/

10-09 03:12