【发布时间】:2017-12-22 05:19:39
【问题描述】:
我正在尝试使用 Photos 框架从 cameraRoll 获取所有照片,但是从 cameraRoll 获取所有照片需要花费大量时间。
他们无论如何都要为其添加分页吗? 所以我可以在滚动时获取。
var images = [UIImage]()
var assets = [PHAsset]()
fileprivate func assetsFetchOptions() -> PHFetchOptions {
let fetchOptions = PHFetchOptions()
//fetchOptions.fetchLimit = 40 //uncomment to limit photo
let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
fetchOptions.sortDescriptors = [sortDescriptor]
return fetchOptions
}
fileprivate func fetchPhotos() {
let allPhotos = PHAsset.fetchAssets(with: .image, options: assetsFetchOptions())
DispatchQueue.global(qos: .background).async {
allPhotos.enumerateObjects({ (asset, count, stop) in
//print(count)
let imageManager = PHImageManager.default()
let targetSize = CGSize(width: 200, height: 200)
let options = PHImageRequestOptions()
options.isSynchronous = true
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options, resultHandler: { (image, info) in
if let image = image {
self.images.append(image)
self.assets.append(asset)
}
if count == allPhotos.count - 1 {
DispatchQueue.main.async {
self.collectionView?.reloadData()
}
}
})
})
}
}
【问题讨论】:
-
不要一次性获取所有照片。随着图库中图像数量的增加,肯定会花费更多时间。因此,仅在需要时才开始获取图像,就像 SDWebImages 一样。编写获取代码在 UICollectionView 数据源方法的 cellForItemAtIndexPath 中。每个单元格只获取一张图像。
-
通过使用 objects(at:) 我在滚动时获取图像。谢谢
-
分享代码帮助他人
标签: ios swift ios11 phasset photosframework