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)
但不幸的是,这似乎也不起作用。
任何帮助将非常感激。太感谢了!
根据我的理解,我无法在后台线程上运行上述代码,因为主上下文绑定到主线程。
与其说上下文“绑定”到线程,不如说您需要确保给定上下文上的操作正确序列化。因此,您可以将主上下文传递到后台操作并将其用于获取,但您需要避免使用主线程中的主上下文,直到后台操作完成。这种协调很容易出错,所以最好避免。
让backgroundContext=container.newBackgroundContext()backgroundContext.parent=mainContext
这应该可行,并且能够在后台操作并共享结果是托管对象上下文具有parent. 但是,您所做的更改只有在保存后backgroundContext才会可见。mainContext您显示的代码中没有调用save(),因此这可能是问题的一部分。
我想从后台线程获取数据以提高性能。
在你在当前的道路上走得太远之前,请确保你确实需要这样做。核心数据可以非常快,并且由于您通常无法同时显示大量数据,因此一次获取所有结果通常没有意义。如果您获取较少数量的对象,您可能会获得所需的性能改进,而无需费心后台操作。
| 归档时间: |
|
| 查看次数: |
2445 次 |
| 最近记录: |