核心数据:后台抓取
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 将处理其余部分。以上是关于核心数据:后台抓取的主要内容,如果未能解决你的问题,请参考以下文章