Быстро, как галерея изображений с 10k + в collectionview - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь показать все изображения галереи в виде коллекции. Я сделал:

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.

Я рад, если вы поможете с кодом.

...