2017-08-08 8 views
0

これは、デバイスギャラリーからイメージを取得するためのコードです。PHAsset.fetchAssetsにオフセットを設定するには?

let imgManager = PHImageManager.default() 
    let requestOptions = PHImageRequestOptions() 

    //loading all the images 
    requestOptions.isSynchronous = false 

    //Quality of the image 
    requestOptions.deliveryMode = .highQualityFormat 

    //requestOptions.resizeMode = .fast 

    //Sorted images 
    let fetchOptions = PHFetchOptions() 
    fetchOptions.fetchLimit = 500 

    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 

    let fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) 

DispatchQueue.global(qos: .background).async { 

     if fetchResult.count > 0 { 

      DispatchQueue.main.async { 
       self.showProgress() 
      } 

      for i in 0..<fetchResult.count{ 

       imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: self.selectedImage.frame.width, height:self.selectedImage.frame.height), contentMode: .aspectFill, options: requestOptions, resultHandler: { 
        image, error in 

        if(image == nil){ 
        }else{ 
         self.imageArray.append(image!) 
        } 
       }) 
      } 

      DispatchQueue.main.async { 
       self.hideProgress() 
       self.photosCollectionView.reloadData() 
      } 

     }else{ 
      self.hideProgress() 
      self.showDefaultAlert(title: "Alert", message: "Could not fetch images from the gallery") 

     } 

デバイスに約1500以上のイメージがあると、メモリに問題が発生します。私はコレクションビューが下にスクロールされるときに次の500のイメージを取得する方法の限界を設定する方法を考え出しましたか?どんな助けでも大歓迎です。

答えて

0

修正する問題は何ですか?私は重い操作が述語追加requestImageに、あなたは

fetchResult.objects(at: IndexSet(0...500)) 
fetchResult.objects(at: IndexSet(501...1000)) 

など を試すことができているかであってもよいし、考える

fetchOptions.predicate = NSPredicate(format: "@NOT(localIdentifier IN %@)", alreadyGettedIdentifiers) 

for i in 0..<fetchResult.count{ 
      let fetchResult = fetchResult.object(at: i) 
      alreadyGettedIdentifiers.append(fetchResult.localIdentifier) 

      PHImageManager.default().requestImage(for: fetchResult, targetSize: CGSize(width: 200, height:200), contentMode: .aspectFill, options: requestOptions, resultHandler: { 
       image, error in 

       if(image == nil){ 
       }else{ 
       self.imageArray.append(image!) 

       } 
      }) 
     } 
関連する問題