2011-07-15 46 views
13

我正在使用NSFetchedResultsController处理UITableView,一切正常,我发现它非常强大,尤其是与结果委托一起使用。 为了深入了解表格,我重复使用了相同的控制器类,它通过单击单元格行实例化参数,然后将控制器推送到UINavigationController,并使用NSFetchedResultsController构建另一个表视图。正确使用NSFetchedResultsController缓存

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

现在的问题。

1)有很多缓存可以是一个问题?

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

3)在deleteCacheWithName的情况下,放置这种方法的最佳位置在哪里?我已经在viewWillDisappear中尝试过了,但对于这种情况,我认为当视图再次出现并且缓存不再存在时(例如与UINavigationController一起使用时)可能会出现问题。可能dealloc方法是最好的地方?

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

5)fetch控制器的代理设置为UITableViewController(fetchController.delegate = self),是否有任何问题?从某种意义上说,如果发生变化,会有多个控制器发出警报?并且deleteCacheWithName也删除委托?

感谢

回答

11

要回答(一些)您的问题:

1)拥有多个高速缓存是没有问题的。事实上,从苹果的类引用:

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

我已经在那里我没有这样做只是为了让我浪费时间试图解决的异常与以前的应用程序的问题。

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

3)我亲自把deleteCacheWithName放在viewDidUnload方法中。不知道这是不是最好的地方。

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

5)这应该不成问题。再次,从苹果公司的文档:

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

仅供参考,这里是链接到苹果开发文档该类:http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

HTH