如何在后台使用 CoreData 获取数据?

Posted

技术标签:

【中文标题】如何在后台使用 CoreData 获取数据?【英文标题】:How to fetch data with CoreData in the background? 【发布时间】:2021-01-10 19:20:33 【问题描述】:

我需要让我的应用长时间保留数据。当我开始阅读有关该主题的文章时,我遇到了 3 种不同的方法,并意识到我没有看到任何差异。请解释以下 fetch 方法的优缺点:

一)

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)

【问题讨论】:

【参考方案1】:

我认为您给出的示例没有区别(仅获取相关)。

A) 总是创建一个新的上下文,这意味着当多次运行创建实体或获取或创建实体时它是不安全的。

在创建的场景中,最好使用B),但需要持有共享的背景上下文。当您执行“执行”时,所有作业都会在一个队列中同步运行。

对于 C),NSAsynchronousFetchRequest 在与 viewContext 一起使用时会大放异彩,您不必创建子/背景上下文。但是为它创建一个并没有错。

【讨论】:

以上是关于如何在后台使用 CoreData 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CoreData 获取完整的对象(不是故障)?

Coredata magicrecord 在后台获取对象进入 <fault> 状态

使用 Web 服务获取 CoreData 背景?

coredata + MagicRecords,如何在后台查找All

iOS核心数据在后台获取导致崩溃

在 cellForRowAtIndexPath 中获取 iOS CoreData 后台线程