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

时间:2018-12-05 13:23:10

标签: ios swift core-data

这两种方法有什么区别?

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
    }
}

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

2 个答案:

答案 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/