我正在开发一个即使在后台也能接收数据的VOIP / Chat应用程序。
我需要在应用移动到后台时禁用NSFetchedResultsController
,以防止后台更改UI。
我这样做 -
- (void)applicationWillResignActive
{
[super applicationWillResignActive];
self.fetchedResultsController.delegate = nil;
}
- (void)applicationDidBecomeActive
{
[super applicationDidBecomeActive];
self.fetchedResultsController.delegate = self.fetchResultControllerDelegate;
}
我注意到在回到前台时我不需要拨打[self.tableView reloadData]
。 (编辑:只是为了澄清核心数据数据库在应用程序处于后台并且fetchedResultsController.delegate为零时使用新数据进行了更新)。
在重新分配fetchedResultsController.delegate
之后,表格会自动更新。
fetchedResultsController
预先形成提取?tableView
和fetchedResultsController
之间发生冲突?由于
答案 0 :(得分:2)
提取结果控制器提供以下功能:
(可选)监视关联的托管对象上下文中对象的更改,并将结果集中的更改报告给其委托(请参阅“Controller的委托”)。 (可选)缓存其计算结果,以便如果随后重新显示相同的数据,则不必重复工作(请参阅“缓存”)。 因此,控制器有效地具有三种操作模式,由它是否具有委托以及是否设置了缓存文件名来确定。
无跟踪:委托设置为nil。 控制器只是提供对执行提取时的数据的访问。
仅内存跟踪:委托为非零,文件缓存名称设置为nil。 控制器监视其结果集中的对象,并更新部分和订购信息以响应相关更改。
完全持久跟踪:委托和文件缓存名称不为零。 控制器监视其结果集中的对象并更新部分和订购信息以响应相关变化。控制器维护其计算结果的持久缓存。
答案 1 :(得分:0)
什么使它更新,fetchedResultsController在重新分配时是否预先形成了fetch?
它仅在您第一次创建提取的结果控制器时进行提取。之后,当发生更改时,会通知数据库中任何对象的任何更改,并评估是否将对象添加到结果列表或将其删除。它永远不会进行第二次获取(除非您得到低内存警告?)。
提取速度慢,必须读取闪存并且需要几毫秒。但是,当一个对象被更改时,它在RAM中,因此操作只需要几纳秒。这就是为什么它努力不去看sqlite数据库。
这种方法是否有任何陷阱可能会导致tableView和fetchedResultsController之间发生冲突?
我不确定,也许吧。如果您在测试中没有发现任何问题,那么我认为您应该认为它没问题。但是,当明年中期推出iOS 8测试版时,请务必再次仔细测试,以便在问题发布之前解决。
如果您担心RAM使用情况,则应该销毁获取的结果控制器。但请注意,当用户切换回您的应用时,再次创建它需要相当长的时间。