在我的应用中有一个照片部分,用户可以插入大量照片。照片作为图像和缩略图保存在Core Data中。允许选中外部存储选项。
我正在使用NSFetchedResultsController,NSFetchRequest.fetchBatchSize设置为27,如下所示。我还将returnsObjectsAsFaults设置为true,这样在需要之前不会从磁盘读取完整的图像。
lazy var frc: NSFetchedResultsController<EventImage> = {
let request = NSFetchRequest<EventImage>(entityName: EventImage.entityName)
request.sortDescriptors = [NSSortDescriptor(key: "timeInterval", ascending: false)]
request.fetchBatchSize = 27
request.predicate = NSPredicate(format: "event = %@", self.event.objectID)
request.returnsObjectsAsFaults = true
let newFRC = NSFetchedResultsController(
fetchRequest: request,
managedObjectContext: self.context,
sectionNameKeyPath: nil,
cacheName: nil)
newFRC.delegate = self
return newFRC
}()
现在,如果NSManagedObjectContext没有父级,则fetchBatchSize受到尊重,可以从sql日志中观察到。
但是,在我的情况下,我有一个privateQueueConcurrencyType上下文用于下载和上传,其中有一个带有mainQueueConcurrencyType的父上下文,用于显示数据,而后者又有一个父privateQueueConcurrencyType上下文,用于保存到磁盘。
现在在我的情况下(经过测试和验证),如果NSManagedObjectContext有父级,则忽略fetchBatchSize,并且从磁盘获取所有图像,这非常慢。缓存有帮助,但仅限于第二次运行。
我假设我不是唯一一个遇到此问题的人(如果上下文存在父问题,则忽略fetchBatchSize)。你是怎么解决的?
任何指针都表示赞赏。