NSFetchResultsController内存处理的解决方案

时间:2015-12-13 03:09:16

标签: ios performance core-data nsfetchedresultscontroller nsfetchrequest

最近,我正在研究一种能够一次创建和浏览大量数据的应用程序。 在此应用程序中,可以在单个时间点从collectionView的{​​{1}}中查看2,000多个对象。

在测试此方案时,很快发现并验证NSFetchedResultsController在访问批处理索引时没有以最佳方式将NSFetchedResultsController页面调入和调出内存。

当从NSManagedObject访问索引并且加载了更多NSFetchedResultsController时,似乎NSManagedObject会将之前加载的NSFetchedResultsController保留在内存中,而不是将它们分页使用NSManagedObject中设置的fetchBatchSize设置的每个访问索引的内存不足。为了进一步解释这一点,如果fetchRequest设置为45,并且现在加载了索引1,000,则fetchBatchSize似乎保留了内存,用于通过索引访问加载的索引1,000之前的所有内容故障。

如果在父上下文中调用NSFetchedResultsController,则会正确释放内存,直到通过索引访问再次加载对象。 managedObjectContext.reset()似乎只是阻止一次加载所有数据。当索引访问时,fetchBatchSize似乎加载新批处理,同时保留先前加载的批处理。

我目前的想法是引导我创建自己的分页,我将有多个NSFetchedResultsControllerfetchResultsControllersfetchBatchSize s ...这似乎要复杂得多是。这将创建一种手动方式,将数据分页到内存不足,从而实现适当的内存管理。

我的问题是,是否有更好的方法来解决这个问题?我基本上想要在使用CoreData的同时分页类似于Apple的Photos应用程序的无限对象(他们的表现让我大吃一惊)。

注意:有关此问题的帖子很多,并指出人们不得不制定手动解决方案以改进内存管理(例如:link#1link#2)。我不是在寻找那些注意到“你忘了这个”或“你可能做错了”的答案。我可以毫无疑问地验证,我正在使用所记录的API。我正在寻找一种有助于更好地管理fetchLimit内存的解决方案。设置NSFetchedResultsController是一种临时解决方案,直到用户加载了大量索引导致内存警告被触发并重置fetchBatchSize。并且在注意之前,是的,我已经测试了有没有设置managedObjectContext缓存并相应地重置....如果有什么我发现缓存本身的单独问题,它并没有真正帮助解决问题什么是永远的。

1 个答案:

答案 0 :(得分:-1)

我怀疑您没有正确使用获取的结果控制器或Core Data。我有150.000条记录的场景,更多的是由一个没有内存(或性能)问题的获取结果控制器提供支持。

有关没有怪癖的设置的一些细节:

  • context当然是主线程上下文
  • fetchBatchSize未设置
  • (可选)使用唯一命名的缓存(获取结果控制器init中的最后一个参数)
    • 重新加载此控制器时必须重置缓存

还要确保您没有将大量图像或其他BLOB直接存储在Core Data中 - 这肯定会降低性能并导致内存管理问题。如果您需要显示图像,请加载它们。