【问题标题】:Asynchronous image loading from Core Data in Swift在 Swift 中从 Core Data 异步加载图像
【发布时间】:2018-03-23 01:52:34
【问题描述】:

我正在构建一个应用程序,它使用 Core Data 数据库将其数据存储在产品上。这些产品显示在UICollectionView 中。此集合视图中的每个单元格都显示其包含的产品的基本信息,包括一张图片。

虽然单元格相对较小,但它们显示的原始图像最好相当大,因为它们也应该能够在更大的图像视图中显示。图片是直接从我的CellForItemAtIndexPath:方法中的Core Data加载的:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionWineCell

        var current: Product!

        //product details are set on labels

        //image is set
        if current.value(forKey: "image") != nil {
            let image = current.value(forKey: "image") as! WineImage
            let loadedImage = UIImage(data: image.image)
            cell.imageview.image = loadedImage
        } else {
            cell.imageview.image = UIImage(named: "ProductPlaceholder.png")
        }

        return cell
    }

当产品集合增加时,滚动会变得更加颠簸,并且会丢失很多帧。这对我来说很有意义,但到目前为止我还没有找到合适的解决方案。在线查看时,有很多文档和框架可用于从 URL(在线或文件路径)异步加载图像,但从 Core Data 执行此操作似乎并不常见。

我已经尝试过使用异步获取请求:

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:"ProductImage")
        fetchRequest.predicate = NSPredicate(format: "product = %@", current)
        let asyncRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { results in
            if let results = results.finalResult {
                let result = results[0] as! ProductImage
                let loadedImage = UIImage(data: result.image)
                DispatchQueue.main.async(execute: {
                    cell.wineImage.image = loadedImage
                })
            }
        }
        _ = try! managedObjectContext.executeRequest(asyncRequest)

但是,这种方法似乎也不能解决问题

问题 在显示来自 Core Data 的大量数据(包括图像)时,如何以不会导致 UICollectionView 中的滞后和丢帧的方式加载图像?

【问题讨论】:

    标签: ios iphone asynchronous core-data uicollectionview


    【解决方案1】:

    如果图像可以像您所说的那样非常大,那么更好的方法不是将它们保存在 Core Data 中,而是将它们放入文件中。将文件名存储在 Core Data 中并使用它来查找文件。

    但这不是直接的问题。即使这样,您也会因花时间打开和解码图像数据而减慢速度。基本上,更好的方法是不要那样做。在您的收藏视图中,图像可能显示得比它们的完整尺寸小得多。不要使用完整大小的图像,而是生成更合适大小的缩略图并在集合视图中使用它。每当您第一次获得图像时,无论是从下载、用户的照片库或其他任何地方,都会生成缩略图。保留缩略图以在集合视图中使用。仅在真正需要时才使用完整尺寸的图片。

    网上有很多图片缩放的例子,这里就不一一列举了。

    【讨论】:

    • 感谢您的回复!我将在我的应用程序中实现这一点,最迟明天会回复您!
    • 我已经在我的项目中实现了你所说的。我的图像在创建和/或接收时也会生成较小的缩略图,并且这些缩略图会异步加载到集合视图的图像中(使用 NUKE),从而使滚动更加流畅。您的回答帮助我达到了可以继续我的项目而不必担心这一点的地步,对此我表示感谢。
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多