异步获取 Swift Xcode

Asynchronous Fetching Swift Xcode

我使用集合视图来显示存储在 CoreData 中的图像,只有少数(大约 15 个)但是当我向下滚动时它滞后,它似乎是因为我没有异步获取我的数据,是否有可能只有15 个 UIImages?

所以这是我的问题,我在 swift 的任何地方都找不到关于异步获取的下降教程,我正在寻找 3 天。抱歉,如果我没有搜索好。

这是对教程中的一些内容的处理

    let entity = NSEntityDescription.entityForName("Dreams", inManagedObjectContext: contxt)

    let fetchRequest = NSFetchRequest()
    fetchRequest.entity = entity

    let asyncFetch = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) {
        (result:NSAsynchronousFetchResult!) -> Void in

        if result.finalResult!.count > 0 {
            self.dreams = result.finalResult! as [Dream]
        }
        NSLog("Done.")
    }

Dreams 是 [Dream] 类型的数组,但是当我显示集合视图时,什么也没有出现 我以前就是这样做的

    let fetchRequest = NSFetchRequest(entityName: "Dreams")

    if let fetchResults = contxt.executeFetchRequest(fetchRequest, error: nil) as? [Dream] {
        dreams = fetchResults
    }

效果很好,

非常感谢您的帮助

不幸的是,我没有时间在这种情况下提供具体的代码。然而,我确实想提出一个基本策略。在主线程上获取不太可能成为您的问题,但一次获取所有内容肯定会成为问题,尤其是涉及到大量二进制数据时。如果出现以下情况,这应该会大大加快:

  1. 您开始使用具有良好批量大小的 NSFetchedResultsController 而不是原始提取请求。 NSFetchedResultsController 对集合视图的更新有点挑剔,其方式超出了这个问题的具体范围,但一旦设置正确,它们就会工作得很好。
  2. 您将图像存储为文件而不是 Core Data 本身,而是存储文件的路径。然后,每次您在对象中出错时,该图像数据都不会加载到内存中,您可以简单地加载和显示图像,因为单元格使用该文件出现在屏幕上 URL.

坚持在 Core Data 中存储二进制数据的人通常会发现,将数据作为唯一属性存储在与您显示的实体有关系的单独 "Image" 实体中会有所帮助。图像对象(连同其二进制图像数据)可以保持错误,因此不在内存中,即使您为集合视图获取的对象在内存中也是如此。然而,我不喜欢将它们存储在核心数据中,而是简单地处理由此产生的原子性陷阱以及文件核心数据点以某种方式被删除的可能性。