【问题标题】:Asynchronous Fetching Swift Xcode异步获取 Swift Xcode
【发布时间】:2015-01-16 17:47:07
【问题描述】:

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

所以这是我的问题,我在任何地方都找不到关于异步获取的下降教程,我正在寻找 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
    }

效果很好,

非常感谢您的帮助

【问题讨论】:

  • 异步获取可能有帮助,但也许没有。这取决于您的代码的结构,因此异步可能是关键,也可能是浪费时间。例如,您在哪里执行这些提取?您是对每个图像进行单独提取,还是批量提取?图像实际上是存储在持久存储中还是外部文件中?
  • 尽可能不要将图像存储在核心数据中,只存储图像名称和/或文件路径
  • 现在我将图像作为 NSData 存储在 CoreData 中,我获取了视图中的图像确实加载了,不,我没有使用批处理,我会尝试你建议的内容(文件路径)
  • 我也面临同样的问题,你找到了这个异步获取的任何解决方案,coredat。 @GauthierdeChezelles

标签: ios swift core-data asynchronous


【解决方案1】:

很遗憾,我没有时间在这种情况下提供具体代码。但是,我确实想介绍一个基本策略。在这里获取主线程不太可能是您的问题,但一次获取所有内容绝对可能是,特别是涉及大量二进制数据时。如果出现以下情况,这应该显着加快:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多