最近,我正在研究一种能够一次创建和浏览大量数据的应用程序。
在此应用程序中,可以在单个时间点从collectionView
的{{1}}中查看2,000多个对象。
在测试此方案时,很快发现并验证NSFetchedResultsController
在访问批处理索引时没有以最佳方式将NSFetchedResultsController
页面调入和调出内存。
当从NSManagedObject
访问索引并且加载了更多NSFetchedResultsController
时,似乎NSManagedObject
会将之前加载的NSFetchedResultsController
保留在内存中,而不是将它们分页使用NSManagedObject
中设置的fetchBatchSize
设置的每个访问索引的内存不足。为了进一步解释这一点,如果fetchRequest
设置为45,并且现在加载了索引1,000,则fetchBatchSize
似乎保留了内存,用于通过索引访问加载的索引1,000之前的所有内容故障。
如果在父上下文中调用NSFetchedResultsController
,则会正确释放内存,直到通过索引访问再次加载对象。 managedObjectContext.reset()
似乎只是阻止一次加载所有数据。当索引访问时,fetchBatchSize
似乎加载新批处理,同时保留先前加载的批处理。
我目前的想法是引导我创建自己的分页,我将有多个NSFetchedResultsController
与fetchResultsControllers
和fetchBatchSize
s ...这似乎要复杂得多是。这将创建一种手动方式,将数据分页到内存不足,从而实现适当的内存管理。
我的问题是,是否有更好的方法来解决这个问题?我基本上想要在使用CoreData的同时分页类似于Apple的Photos应用程序的无限对象(他们的表现让我大吃一惊)。
注意:有关此问题的帖子很多,并指出人们不得不制定手动解决方案以改进内存管理(例如:link#1,link#2)。我不是在寻找那些注意到“你忘了这个”或“你可能做错了”的答案。我可以毫无疑问地验证,我正在使用所记录的API。我正在寻找一种有助于更好地管理fetchLimit
内存的解决方案。设置NSFetchedResultsController
是一种临时解决方案,直到用户加载了大量索引导致内存警告被触发并重置fetchBatchSize
。并且在注意之前,是的,我已经测试了有没有设置managedObjectContext
缓存并相应地重置....如果有什么我发现缓存本身的单独问题,它并没有真正帮助解决问题什么是永远的。
答案 0 :(得分:-1)
我怀疑您没有正确使用获取的结果控制器或Core Data。我有150.000条记录的场景,更多的是由一个没有内存(或性能)问题的获取结果控制器提供支持。
有关没有怪癖的设置的一些细节:
fetchBatchSize
未设置还要确保您没有将大量图像或其他BLOB
直接存储在Core Data中 - 这肯定会降低性能并导致内存管理问题。如果您需要显示图像,请加载它们。