Cocoa Touch:何时需要使用NSFetchedResultsController来管理Core Data的获取?

6
我正在开发一款iPhone应用程序,它大量使用Core Data,主要是为了其类似于数据库的功能(例如在提取请求中设置排序顺序或谓词的能力)。我将所有提取到的数据都呈现在各种UITableViewControllers中。
我想知道的是,在使用NSFetchedResultsController处理请求之前,我可以提取多少对象。在Core Data文档中,它说SQLite存储认为“10,000个对象是一个相当小的数据集”,但在NSFetchedResultsController的文档中,它提到每次保留“数十个对象”在内存中。
我主要处理高达五十个对象的数据集,每个对象可能有十几个NSNumber和NSString实例,以及下一组对象的一对多关系(即有二十个对象A的实例,每个实例都有一对多关系连接到三十个(不同的)对象B的实例中,每个实例...)。
这种情况是否适合使用NSFetchedResultsController,或者我可以使用简单的NSArray结果?我没有管理控制器的细节问题(方便的方法获取UITableView索引路径的对象,将新对象添加回上下文等),我只是想知道每种方法的内存使用情况。
我应该提到,该应用程序主要针对iPhone 3G(不是S)和第一代iPod Touch用户,因此请记住这些平台的有限内存。
1个回答

11

NSFetchedResultsController 是一个非常方便的帮助类,可用于将 Core Data 与您的 UITableView 集成。我建议在具有 Core Data 支持的任何表视图中使用它。在我使用它的每种情况下,它都显着减少了我的编写代码量。

从性能角度来看,它也可以带来巨大的改进。如果您使用 -setFetchBatchSize: 将 NSFetchRequest 配置到 NSFetchedResultsController 中,则可以执行分批获取,仅获取在您的表视图中显示的相关数据。不再显示的数据也可以自动从内存中删除(或者这是我的理解)。

对于具有中等到大型数据集的表格,这可以带来显着的性能优势。苹果工程师曾经表示,在拥有一万个项目数据库的情况下,这可以将启动时间缩短80%以上,并将内存使用率降低50%。


1
我完全赞同,并且无法推荐它够多。我正在使用CoreData重新编写我的应用程序,使用FetchedResultsController后,我已经获得了巨大的收益。 - jbrennan
除了我个人在使用fetchResultsController时遇到了加载数据集的问题,目前我不会为其背书。当通过它进行分页时,它似乎无法适当地清除其fetchedObjects,并且似乎一直坚持着在加载它们时保留所有内容。 - TheCodingArt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接