iPhone奇怪的CoreData缓存性能问题

don*_*tic 2 iphone performance caching core-data

我正在开发一个使用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秒.赶快行动吧!

启用缓存是否仅缓存表视图的索引信息而不是缓存的对象本身?

我不确定这笔交易是什么.我希望我能够很好地解释这一点 - 如果您想查看一些代码或需要其他信息,请告诉我.

谢谢!比利

don*_*tic 5

好吧,我发现了我的问题是什么......

基本上,通过objectAtIndexPath:向我的NSFetchedResultsController询问一个managedObject比直接到fetchedObjects数组并且要求objectAtIndex:(当然,这就是我正在做的事情)要快得多,特别是当你的索引进入数千时.不过,我不确定100%为什么会这样.我猜NSFetchedResultsController做了一些有趣的东西来有效地拉出单个对象,而不是直接转向原始数据.所以,我不认为缓存与我的性能问题有任何关系.

感谢那些查看我的问题的人.我希望这可以帮助其他有类似问题的人.