我看过很多类似的问题,但似乎没有答案。
我有一个后台线程,用来获取数据。
// bg queue
let context = // private context with NSPrivateQueueConcurrencyType
users = Model.MR_findAllSortedBy("username", ascending: true, inContext: context) as! [Model]
我想重载tableView在主线程与[模型]数组。如果我将users
直接传递给主线程,它将导致未定义的行为(根据CD文档)。
另一方面,我有两个选择:
- 在主上下文中获取对象(这会导致UI阻塞)
- 传递objectId,这导致对象无故障(这导致UI阻塞)
正确的处理方法是什么?
最好的设置是使用带有NSFetchedResultsController
的表视图(对于Magical Record也非常方便),并实现将自动更新表的NSFetchedResultsControllerDelegate
。
在主线程上很容易获取所有的数据和排序(FRC将优化并只获取表视图需要显示的内容)。这意味着你对选项1的假设。是不正确的
do { fetchedResultsController.performFetch() } catch {}
tableView.reloadData()