我正在开发一个使用Core Data和NSFetchedResultsController的应用。应用程序的一个主要组件是基于一组15个左右的预定义开关,在索引表视图中过滤项目,这些开关对应于我的托管对象的属性或关系。在我的大多数情况下,我正在搜索一组大约300-400个对象,因此缓存/性能不是问题。一切都非常活泼,不需要缓存。
然而,我的应用程序的一部分基本上搜索了我的CD数据库中的所有对象(约15,000项)。在这里,我正在尝试在NSFetchedResultsController上实现缓存以提高性能。 NSFetchedResultsController的'cacheString'属性只是谓词的字符串值。每当用户切换过滤器开关时,我创建一个新谓词,创建一个新的NSFetchedResultsController,并将缓存设置为新谓词的字符串值。获得所有项目(未经过滤)的第一次打击大约需要7秒,后续点击次数不到一次。
但奇怪的是 - 这是我的问题 - 一旦我进入表格视图的“下一步”(我将一个新的视图控制器推送到导航控制器,将它传递给NSFetchedResultsController的fetchedObjects),性能大幅下降。下一个视图本质上是前一个视图的表列表的不同表示(水平分页滚动视图),一次在屏幕上有一个项目。当我从一个项目转到下一个项目时,访问fetchedObjects数组中的上一个或下一个对象会将手机锁定大约5秒钟。 “锁定”持续时间会进一步增加您进入fetchedObjects数组的时间。如果'i == 0',则没有可感知的滞后。如果'i == 10,000',则访问下一个对象大约需要15秒。赶快行动吧!如果我禁用缓存(或者它是一个未缓存的查询,因此需要提取新的结果),除了初始过滤查询之外的所有内容都是快速且快速的,零滞后。
启用缓存是否只缓存表视图的索引信息而不是缓存的对象本身?
我不确定这笔交易是什么。我希望我能够很好地解释这一点 - 如果你想查看一些代码或需要其他信息,请告诉我。
谢谢! 比利
答案 0 :(得分:5)
好吧,我发现了我的问题......
基本上,通过objectAtIndexPath:向我的NSFetchedResultsController询问一个managedObject比直接到fetchedObjects数组并且要求objectAtIndex:(当然,这就是我正在做的事情)要快得多,特别是当你的索引进入数千时。不过,我不确定100%为什么会这样。我猜测NSFetchedResultsController做了一些有趣的东西来有效地拉出单个对象,而不是直接转向原始数据。所以,我不认为缓存与我的性能问题有任何关系。
感谢那些查看我的问题的人。我希望这可以帮助其他有类似问题的人。