Swift 我试图从本地标识符获取资源,并在collectionview中显示图像,但这会导致滚动抖动

Swift 我试图从本地标识符获取资源,并在collectionview中显示图像,但这会导致滚动抖动,swift,uicollectionview,phasset,phassetslibrary,Swift,Uicollectionview,Phasset,Phassetslibrary,我正在尝试以下方法从本地标识符获取资产,并将其显示在集合视图中,但在加载时滚动会变得急促 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GridCe

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

 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

        }
    })

不应在
cellForItemAt
方法中执行昂贵的操作。之所以会出现这种突变,是因为滚动被延迟,直到该方法完成。这是由于以下原因造成的:

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

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

不应在
cellForItemAt
方法中执行昂贵的操作。之所以会出现这种突变,是因为滚动被延迟,直到该方法完成。这是由于以下原因造成的:

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

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

PHAsset.fetchAssets(..)调用同步进行,这会阻止collectionView的呈现,并导致滚动停顿。为了平滑滚动,请始终异步获取资源,以不阻塞主线程


对于加载相集,建议查看Cocoa Touch提供的
PHImageManager
类。

相集.fetchAssets(..)调用同步进行,这会阻止collectionView的呈现,并导致滚动停顿。为了平滑滚动,请始终异步获取资源,以不阻塞主线程

要加载相集,建议查看Cocoa Touch提供的
PHImageManager