Я пытаюсь показать все изображения галереи в виде коллекции. Я сделал:
class SelectGallery: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
var imageArray = [UIImage]()
@IBOutlet weak var CollectionGallery: UICollectionView!
override func viewDidLoad() {
self.CollectionGallery.delegate = self
self.CollectionGallery.dataSource = self
super.viewDidLoad()
let status = PHPhotoLibrary.authorizationStatus()
switch status {
case .authorized:
self.showPhotos()
break
}
}
Я проверил разрешение пользователя. (Все разрешения Info.plist запрашиваются у пользователя). Если позволяет пользователь, запускается приведенный ниже код.
func showPhotos(){
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
requestOptions.deliveryMode = .highQualityFormat
requestOptions.resizeMode = .fast
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions){
for i in 0..<fetchResult.count {
imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: { image , error in
self.imageArray.insert(image!, at: i)
DispatchQueue.main.async {
self.CollectionGallery.reloadData()
}
})
}
}
}
My CollectionView работает следующим образом:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
let imageView = cell.viewWithTag(1) as! UIImageView
imageView.image = imageArray[indexPath.row]
return cell
}
Приведенный выше код работает для загрузки изображений. Но, мой вопрос: если у меня более 10k изображений в галерее, для запуска потребуется 20-25 секунд.
Я думаю, это происходит из-за self.imageArray.insert(image!, at: i)
этой строки. Я пытаюсь вставить все (10k +) изображений в массив и показывая в collectionview. Вот так это занимает слишком много времени. Я нахожу и пробую некоторые примеры PHCachingImageManager
, но, честно говоря, я не знаю, как его использовать.
Итак, как я могу показать изображения из галереи в коллекцию с хорошей производительностью, даже если больше, чем 10k.
Я рад, если вы поможете с кодом.