繁体   English   中英

从Swift中的Core Data异步加载图片

[英]Asynchronous image loading from Core Data in Swift

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

尽管单元格相对较小,但是它们显示的原始图像最好很大,因为它们也应该能够以较大的图像视图显示。 图像直接从CellForItemAtIndexPath:核心数据加载CellForItemAtIndexPath:方法:

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引起滞后和丢帧的方式加载图像?

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

但这不是眼前的问题。 即使这样,您也会花费大量时间打开和解码图像数据,从而减慢速度。 更好的方法是,基本上不要这样做。 在您的收藏夹视图中,显示的图像可能比其全尺寸小得多。 代替使用完整尺寸的图像,而是以更合适的尺寸生成缩略图,然后在收藏夹视图中使用该缩略图。 无论何时从下载或用户的图片库中或任何地方获取图像,都应进行缩略图生成。 保留缩略图以在集合视图中使用。 仅在确实需要时使用完整尺寸的图像。

在线上有许多有关如何缩放图像的示例,因此在此不再赘述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM