最近在做一个获取本地相册所有视频缩略图的需求,用到了AVAsset与PHAsset。但是在滑动collectionView的时候会报内存警告,而且滑动的快了cell会疯狂刷新。有没有大佬给我个解决办法啊。下面附上代码
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: VideoListViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! VideoListViewCell
if assetsFetchResults?.count != 0 && assetsFetchResults != nil {
//assetsFetchResults为所有视频的PHAsset
let asset = assetsFetchResults![(indexPath as NSIndexPath).row]
let options = PHVideoRequestOptions()
options.version = .current
options.deliveryMode = .automatic
self.imageManager.requestAVAsset(forVideo: asset, options: options, resultHandler: { (videoAsset, audioMix, info) in
guard videoAsset != nil else { return }
let seconds = ceil(Double(videoAsset!.duration.value) / Double(videoAsset!.duration.timescale))
let timeStr = CameraUtilities.timeDescriptionOfTimeInterval(interval: seconds)
let generator = AVAssetImageGenerator(asset: videoAsset!)
generator.appliesPreferredTrackTransform = true
let needTime = CMTimeMakeWithSeconds(0.0, 600)
var actualTime = CMTime()
let image = try? generator.copyCGImage(at: needTime, actualTime: &actualTime)
guard image != nil else { return }
cell.setData(bgImage: UIImage(cgImage: image!), timeStr: timeStr)
})
cell.updateCellWithItem(item: asset)
}
cell.layer.masksToBounds = true
return cell
}
解决方案:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: VideoListViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! VideoListViewCell
if assetsFetchResults?.count != 0 && assetsFetchResults != nil {
let asset = assetsFetchResults![(indexPath as NSIndexPath).row]
self.imageManager.requestImage(for: asset, targetSize: assetGridThumbnailSize, contentMode: .aspectFill, options: nil, resultHandler: { (image, info) in
guard image != nil else { return }
cell.setData(bgImage: image!, timeStr: CameraUtilities.timeDescriptionOfTimeInterval(interval: asset.duration))
})
cell.updateCellWithItem(item: asset)
}
cell.layer.masksToBounds = true
return cell
}