我想从手机中获取所有图像。在照片库中创建多个选择。我使用下面的代码从手机中获取所有图像。它工作得很好,但是当手机上有1000张图片时,要花更多的时间来获取所有的图片并显示在屏幕上,如何减少从手机上获取所有图片的时间。
// get all images from photos
func getAllImagesFromPhotos() -> [Photos]?
{
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: true)]
let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
var allImages = [Photos]()
for index in 0..<fetchResult.count
{
let asset = fetchResult.object(at: index) as PHAsset
imgManager.requestImage(for: asset, targetSize: CGSize(width:200,height:200), contentMode: .aspectFill, options: requestOptions, resultHandler: { (uiimage, info) in
if let image = uiimage
{
allImages.append(Photos(image: image, selected: false))
}
})
}
return allImages
}
最佳答案
要解决您的问题,您需要实际批量加载图像,一次加载10个图像,并在用户滚动多一点时显示它们,加载下一批图像,等等。。
如果您加载所有图像,那么当然会有一个不可避免的性能打击。
您要使用的是UIKit中的UIImagePickerController类
Here是苹果公司在UIImagePickerController上的文档。
如果不想使用UIImagePickerController,则必须一次加载较小的图像集,并允许用户通过在选择视图上进一步滚动来“加载更多图像”。
编辑:多图像选择
在阅读了您关于希望选择多个图像的评论后,很明显UIImagePickerController是用来选择单个图像的,但是,您不能在选择时将其取消,当用户选择一个图像时,会有一条toast消息说“Image selected”,而不能取消视图,允许用户选择另一个图像等。。如果用户再次选择相同的图像,您可以再次显示吐司,并说“图像已删除”,因为您可以验证该图像是否已从以前的位置选择。
如果你不想实现这个解决方案,你唯一的选择就是批量加载大约10个图像的小块图像,就像我在原始答案中推荐的那样。
但是,如果您真的不想自己实现这个功能,我建议您使用第三方库,例如ELCImagePickerController之类的库,还有数百个其他的库可以做到这一点。
希望这有用,祝你好运