核心数据:后台抓取

Posted

技术标签:

【中文标题】核心数据:后台抓取【英文标题】:Core data: background fetching 【发布时间】:2015-09-12 21:43:06 【问题描述】:

我已经阅读了大量类似的问题,但似乎没有答案。

我有一个后台线程,用于获取数据。

// bg queue
let context = // private context with NSPrivateQueueConcurrencyType
users = Model.MR_findAllSortedBy("username", ascending: true, inContext: context) as! [Model]

我想用 [Model] 数组在主线程中重新加载 tableView。 如果我将 users 直接传递给主线程,则会导致未定义的行为(根据 CD 文档)。

另一方面,我有两个选择:

    在主上下文中获取对象(这会导致 UI 块) 传递 objectId 导致对象无故障(导致 UI 块)

正确的处理方法是什么?

【问题讨论】:

【参考方案1】:

最好的设置是使用带有NSFetchedResultsController 的表格视图(Magical Record 也非常方便)并实现NSFetchedResultsControllerDelegate,它将自动更新表格。

只需在主线程上轻松获取所有内容并进行排序(FRC 将优化并仅获取表格视图需要显示的内容)。这意味着您对选项 1. 的假设不正确。

do  fetchedResultsController.performFetch()  catch 
tableView.reloadData()

就是你所需要的。

【讨论】:

除了NSfetchedResultController还有其他方法吗? 您不需要其他设置。 FRC 可以帮助您尽可能少地获取数据,从而避免 大量数据库搜索,而这正是首先需要后台获取的东西。自己手动进行优化非常困难。 话虽如此,你可以做到,但不应该这样做,除非你有令人信服的理由需要它。我没有看到。 假设我需要先进行分页并从服务器获取数据,然后才将其传递给 FRC 那个在后台做,但是没有将对象传递给一些主线程数组。只需save(),将更改推送到主线程上的父上下文,FRC 将处理其余部分。

以上是关于核心数据:后台抓取的主要内容,如果未能解决你的问题,请参考以下文章

如何将正常的核心数据变为后台?

应用从后台恢复时核心数据实体消失

删除核心数据对象并保存在后台线程中

iPhone 编程 - 使用核心数据进行后台保存

在位置后台模式下从核心数据访问数据

核心数据在后台插入大数据