我正在尝试从本地标识符中获取资产并在 collectionview 中显示图像,但它会导致滚动抖动

Posted

技术标签:

【中文标题】我正在尝试从本地标识符中获取资产并在 collectionview 中显示图像,但它会导致滚动抖动【英文标题】:I am trying to fetch asset from local identifier and displaying images in collectionview but it makes scroll jerkiness 【发布时间】:2017-07-26 14:31:03 【问题描述】:

我正在尝试以下方法从本地标识符中获取资产并将其显示在集合视图中,但加载时滚动变得生涩。

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GridCell", for: indexPath) as! GridCell

    cell.representedAssetIdentifier = "some uri"

        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = false
    let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject

    imageManager.requestImage(for: asset!, targetSize: thumbnailSize, contentMode: .aspectFit, options: requestOptions, resultHandler:  result, info in
        if cell.representedAssetIdentifier =="someuri" 

             cell.imageview.image = result

        
    )

【问题讨论】:

【参考方案1】:

不应在cellForItemAt 方法中执行昂贵的操作。不稳定是因为滚动被延迟到该方法完成。这是由以下行引起的:

let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject

删除该行,您将看到滚动将像黄油一样平滑。要解决此问题,您需要更聪明地了解该行在何时何地执行(如果可重复使用),然后在 viewDidLoad 上执行一次并将其存储为变量。

【讨论】:

【参考方案2】:

PHAsset.fetchAssets( .. ) 调用是同步发生的,这会阻塞 collectionView 的呈现,并使滚动卡顿。为了平滑滚动,请始终异步获取资源,以免阻塞主线程。

关于加载 PHAsset,建议查看 Cocoa Touch 提供的 PHImageManager 类。

【讨论】:

以上是关于我正在尝试从本地标识符中获取资产并在 collectionview 中显示图像,但它会导致滚动抖动的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用带有本地标识符的获取资产?

按顺序获取 PHAsset

PHAsset Null 但本地标识符有效

如何从SFTP服务器获取文本文件并在VBScript中本地存储

使用改造从(本地)android资产文件夹获取Json数据

在不加载 PHAsset us 照片库的情况下获取所有图像本地标识符/文件路径