如何在后台使用 CoreData 获取数据?
How to fetch data with CoreData in the background?
我需要让我的应用程序长时间保存数据。当我开始阅读有关该主题的文章时,我遇到了 3 种不同的方法,并意识到我没有看到任何差异。请说明以下fetch方法的优缺点:
A)
container.performBackgroundTask { context in
self.data = try! context.fetch(request)
DispatchQueue.main.async {
self.updateUI()
}
}
B)
let context = container.newBackgroundContext()
context.perform {
self.data = try! context.fetch(request)
DispatchQueue.main.async {
self.updateUI()
}
}
C)
let context = container.newBackgroundContext()
let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: request) { result in
self.data = result.finalResult!.first!.data!
DispatchQueue.main.async {
self.updateUI()
}
}
try! context.execute(asyncFetchRequest)
我认为你给出的例子没有什么区别(只有fetch相关)。
A) 总是创建一个新的上下文,这意味着当多个 运行 用于创建实体或获取或创建实体时是不安全的。
在创建场景下,最好使用B),但需要持有共享后台上下文。当您执行 'perform' 时,一个队列中的所有作业 运行 同步。
对于 C),NSAsynchronousFetchRequest 在与 viewContext 一起使用时大放异彩,您不必创建 child/background 上下文。但是为它创造一个并没有错。
我需要让我的应用程序长时间保存数据。当我开始阅读有关该主题的文章时,我遇到了 3 种不同的方法,并意识到我没有看到任何差异。请说明以下fetch方法的优缺点:
A)
container.performBackgroundTask { context in
self.data = try! context.fetch(request)
DispatchQueue.main.async {
self.updateUI()
}
}
B)
let context = container.newBackgroundContext()
context.perform {
self.data = try! context.fetch(request)
DispatchQueue.main.async {
self.updateUI()
}
}
C)
let context = container.newBackgroundContext()
let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: request) { result in
self.data = result.finalResult!.first!.data!
DispatchQueue.main.async {
self.updateUI()
}
}
try! context.execute(asyncFetchRequest)
我认为你给出的例子没有什么区别(只有fetch相关)。
A) 总是创建一个新的上下文,这意味着当多个 运行 用于创建实体或获取或创建实体时是不安全的。
在创建场景下,最好使用B),但需要持有共享后台上下文。当您执行 'perform' 时,一个队列中的所有作业 运行 同步。
对于 C),NSAsynchronousFetchRequest 在与 viewContext 一起使用时大放异彩,您不必创建 child/background 上下文。但是为它创造一个并没有错。