2017-03-29 24 views
2

私は、写真アルバムからすべてのユーザーの写真を読み込むUICollectionViewを持っています。ユーザーがコントローラーを開くと、すべての写真がフェッチされ、アレイに保管されます。写真をタップすると、黒い背景とその写真のより大きなバージョンのサブビューが作成されます。もう一度タップすると、それをズームアウトしてスーパービューから削除します。Swift - CollectionViewのアルバムから写真を取得して解像度を維持する

私の問題は、写真の元のサイズを維持する方法と実行時間を低く抑える方法がわかりません。コレクションに100以上の写真が読み込まれていると、読み込み時間が著しく損なわれます。

私は実際にはそれがセルの境界(私は行ごとに3つのセルがある)にしたいので、より高いCGSizeで画像をフェッチする必要はないと思う。 250 250によるリターン0.20秒実行時間

300 300による戻り私は何を達成したいことは、非常に維持することです

3.0秒の実行時に画像をフェッチで

の取得画像実行時間が短く、タップしたときに鮮明なサムネイルとその写真の高解像度バージョンがあります。バックグラウンドですべてを読み込むために2番目のスレッドを作成する必要がありますか、私のviewDidLoadで私の関数を呼び出さないほうが良いですか?あなたには、いくつかの重い処理を行っている場合

var imageArray = [UIImage]() 

func getPhotosFromAlbum() { 

    let imageManager = PHImageManager.default() 

    let requestOptions = PHImageRequestOptions() 
    requestOptions.isSynchronous = true 
    requestOptions.deliveryMode = .highQualityFormat 

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

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

     if fetchResult.count > 0 { 

      for i in 0..<fetchResult.count { 

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

        self.imageArray.append(image!) 
       }) 
      } 
     } else { 
       self.collectionView?.reloadData() 
    } 
} 
+0

通常、重い処理を行っている場合は、バックグラウンドスレッドで実行して、メインスレッドをロックしたり、UIのやりとりを邪魔しないようにしてください。もちろん、その場合は、メインスレッドでUI更新を行うことを忘れないでください。あなたがやっていることの代わりに、サムネイルのキャッシュはあなたがやりたいことに意味がありますか?はいの場合、それはあなたがすでに必要とするほとんどのイメージを持っていて、新しいイメージのためのサムネイルを取り出すだけでよいので、あなたが探求したいかもしれないオプションかもしれません。 – Fahim

+0

ありがとう!コレクションビューに画像を読み込む背景スレッドを追加しました。私はそれが今うまく動作すると思う:-) –

+0

偉大な:)私は答えに私のコメントを変換しました。参考になった場合は「正しい」と記入してください。 – Fahim

答えて

2

は一般的に、あなたがあなたのメインスレッドをロックまたはUIの相互作用が低迷にしないように、バックグラウンドスレッドでそれを行うことをお勧めします。もちろん、その場合は、メインスレッドでUI更新を行うことを忘れないでください。

関連する問題