1

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

 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

        }
    })
4

2 回答 2

0

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

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

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

于 2017-07-26T14:37:55.533 回答
0

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

对于加载 PHAssets,建议查看PHImageManagerCocoa Touch 提供的类。

于 2017-07-26T14:41:34.750 回答