正确使用NSFetchedResultsController缓存

时间:2011-07-15 09:48:00

标签: objective-c uitableview nsfetchedresultscontroller

我正在使用NSFetchedResultsController处理UITableView,一切正常,我发现它非常强大,特别是与结果委托相结合。 为了向下钻取表格,我正在重复使用相同的控制器类,通过单击单元格行来获取参数,然后将控制器推送到UINavigationController并再次使用NSFetchedResultsController构建另一个表视图。

此时,每个控制器都有自己的缓存,缓存名称是使用唯一标识符[NSString stringWithFormat“cacheName _%@”,uniqueStringForCell]派生的,最后我显然可以有很多缓存。

现在问题。

1)有很多缓存可能有问题吗?

2)我们什么时候应该使用缓存?

3)在deleteCacheWithName的情况下,放置此类方法的最佳位置在哪里?我已经尝试过viewWillDisappear,但是有了这个,我认为当视图再次出现并且缓存不再存在时,例如当使用UINavigationController时,我会遇到问题。 dealloc方法可能是最好的地方吗?

4)缓存和内存管理之间的关系是什么?我的意思是,当发送(void)didReceiveMemoryWarning时,我是否需要删除缓存?如果是的话,那又重建一次呢?什么是首选方式,也许重新发出提取?

5)fetch控制器的委托设置为UITableViewController(fetchController.delegate = self),有什么问题吗?从某种意义上说,如果发生变化,会提醒多个控制器? deleteCacheWithName也会删除委托吗?

感谢

1 个答案:

答案 0 :(得分:11)

回答(一些)你的问题:

1)拥有多个缓存不是问题。事实上,从Apple的课程参考:

  • 如果您有多个获取的结果控制器具有不同的结果 配置(不同的排序描述符等),你必须给 每个都有不同的缓存名称。

我之前的应用程序遇到了问题,我没有这样做,只是为了得到一个我浪费时间试图解决的例外。

2)我们应该使用缓存来存储NSFetchedResultsController需要做的任何重复工作。无论何时更改部分或订购信息,都会更新缓存。同样,如果缓存与数据库中的当前信息不一致(您添加了新行,已删除等),则控制器会释放缓存并将其清除。

3)我个人将deleteCacheWithName放在viewDidUnload方法中。不知道这是不是最好的地方。

不确定4.在重建缓存方面 - 如果当前缓存与应用程序不同步,这应该会自动发生。我没有对我的任何应用程序的内存管理和缓存做任何具体的事情。

5)这应该不是问题。再次,从Apple的文档:

  • 如果为获取的结果控制器设置委托,则为 控制器注册以从其托管接收更改通知 对象上下文。影响结果集的上下文中的任何更改 或处理部分信息并更新结果 因此。控制器在结果对象时通知代理 更改位置或修改部分时(请参阅 NSFetchedResultsControllerDelegate)。您通常使用这些方法 更新表格视图的显示。

仅供参考,以下是本课程的苹果开发者文档的链接:http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

HTH