我正在尝试使用以下方法从本地标识符中获取资源并在集合视图中显示它,但在加载时滚动变得不稳定。
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
}
})
答案 0 :(得分:0)
不应在cellForItemAt
方法中执行昂贵的操作。波动是因为滚动被延迟直到该方法完成。这特别是由以下行引起的:
let asset = PHAsset.fetchAssets(withLocalIdentifiers: ["some uri"!], options: .none).firstObject
删除该行,您将看到滚动将像黄油一样平滑。要解决这个问题,你需要更聪明地知道该行何时何地被执行,如果它可以重复使用,然后在viewDidLoad
上执行一次并将其存储为变量。
答案 1 :(得分:0)
PHAsset.fetchAssets( .. )
调用同步发生,阻止了collectionView的渲染,并使滚动口吃。为了平滑滚动,总是异步获取资源以不阻塞主线程。
要加载PHAssets,建议查看Cocoa Touch提供的PHImageManager
类。