核心数据NSFetchedResultsController和fetchBatchSize麻烦

时间:2016-11-16 09:49:28

标签: swift xcode core-data nsfetchrequest

在我的应用中有一个照片部分,用户可以插入大量照片。照片作为图像和缩略图保存在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)。你是怎么解决的?

任何指针都表示赞赏。

0 个答案:

没有答案