我试图从本地标识符中获取资产并在collectionview中显示图像,但它会使滚动急动

时间:2017-07-26 14:31:04

标签: swift uicollectionview phasset phassetslibrary

我正在尝试使用以下方法从本地标识符中获取资源并在集合视图中显示它,但在加载时滚动变得不稳定。

 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

        }
    })

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

PHAsset.fetchAssets( .. )调用同步发生,阻止了collectionView的渲染,并使滚动口吃。为了平滑滚动,总是异步获取资源以不阻塞主线程。

要加载PHAssets,建议查看Cocoa Touch提供的PHImageManager类。