使用 Core Data 从后台线程获取

Mof*_*waw 1 core-data ios swift

我想从后台线程获取数据以提高性能。我怎样才能实现这个目标?我无法在任何地方找到帮助。

目前,我正在像这样获取数据:

do {
    let items = try mainContext.fetch(Item.fetchRequest())
    return items
} catch { ... }
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我无法在后台线程上运行上述代码,因为主上下文绑定到主线程。所以这是不可能的:

DispatchQueue.global().async {
    do {
        let items = try mainContext.fetch(Item.fetchRequest())
        completion(items)
    } catch { ... }
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试在背景上下文中执行此操作,如下所示:

let backgroundContext = container.newBackgroundContext()
backgroundContext.parent = mainContext

backgroundContext.perform {
    do {
        let items = try backgroundContext.fetch(Item.fetchRequest())
        DispatchQueue.main.async { completion(items) }
    } catch { ... }
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这似乎也不起作用。

任何帮助将非常感激。太感谢了!

Cal*_*leb 9

根据我的理解,我无法在后台线程上运行上述代码,因为主上下文绑定到主线程。

与其说上下文“绑定”到线程,不如说您需要确保给定上下文上的操作正确序列化。因此,您可以将主上下文传递到后台操作并将其用于获取,但您需要避免使用主线程中的主上下文,直到后台操作完成。这种协调很容易出错,所以最好避免。

让backgroundContext=container.newBackgroundContext()backgroundContext.parent=mainContext

这应该可行,并且能够在后台操作并共享结果是托管对象上下文具有parent. 但是,您所做的更改只有在保存后backgroundContext才会可见。mainContext您显示的代码中没有调用save(),因此这可能是问题的一部分。

我想从后台线程获取数据以提高性能。

在你在当前的道路上走得太远之前,请确保你确实需要这样做。核心数据可以非常快,并且由于您通常无法同时显示大量数据,因此一次获取所有结果通常没有意义。如果您获取较少数量的对象,您可能会获得所需的性能改进,而无需费心后台操作。

  • 这对我帮助很大。经过几个小时的猜测和检查编码,然后是更多的时间研究正确的多线程 CoreData 实现——你让我跳出这个框框思考,并意识到我正在获取的对象数量并不真正需要运行出于性能考虑的背景。救星,加油。 (2认同)