正确使用NSFetchedResultsController缓存

Leo*_*rdo 14 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也会删除委托吗?

谢谢

arm*_*han 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