我正在尝试从本地标识符中获取资产并在 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 中显示图像,但它会导致滚动抖动的主要内容,如果未能解决你的问题,请参考以下文章