SwiftにてcollectionView をつかったアルバムアプリを作成しております。
PHAsset.fetchAssetにてPHAssetを取得し
PHCachingImageManagerにて画像を表示しています。
画像のサイズが200×200ですとギリギリ表示されるのですが
画像のサイズを400×400などに設定するとほぼ動作しなくなり
Swift
1Message from debugger: Terminated due to memory issue 2 3[GatekeeperXPC] Connection to assetsd was interrupted or assetsd died
などのメッセージが出てアプリが落ちてしまいます。
今の所以下のようなやり方でスマートアルバム、アルバムを取得しています。
Swift
1func getPhotos(albumName1: PHAssetCollectionType, albumName2: PHAssetCollectionSubtype){ 2// let imgManager = PHImageManager.default() 3 let cacheManeger = PHCachingImageManager() 4 cacheManeger.allowsCachingHighQualityImages = false 5 6 let requestOptions = PHImageRequestOptions() 7 requestOptions.isSynchronous = false 8 requestOptions.deliveryMode = .highQualityFormat 9 10 let fetchOptions = PHFetchOptions() 11 fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 12 13 14// アセットコレクションを取得 15 let assetCollections = PHAssetCollection.fetchAssetCollections(with: albumName1, subtype: albumName2, options: nil) 16 17 assetCollections.enumerateObjects { assetCollection, index, stop in 18 19 // アセットを取得 20 let assets = PHAsset.fetchAssets(in: assetCollection, options: fetchOptions) 21 22 23 24 assets.enumerateObjects { asset, index, stop in 25 26 cacheManeger.startCachingImages(for: [asset], targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions) 27 28 cacheManeger.requestImage(for: asset, targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: { img, _ in 29// DispatchQueue.global().async { 30 31 if let img2 = img { 32 // print("画像の取得に成功") 33 34 if assetCollection.localizedTitle == "(selectAlbum)" 35 { 36 imageArray.append(img2) 37 }else if assetCollection.assetCollectionType == .smartAlbum{ 38 imageArray.append(img2) 39 40 } 41 photosTotalAmount = [Int](0...imageArray.count) 42 43 } 44 }) 45 46 } 47 } 48 }
app storeで配信されているアルバムアプリやカメラアプリの写真選択画面などでは、ほぼ全ての画像が高画質で3秒も経たぬうちに読み込まれて表示されています。
なぜそんなに高速なのでしょうかPHImageManager以外の方法、ライブラリなどあるのでしょうか?
いまのやり方ですと写真5000枚程度のカメラロールを取得するのに早くても5秒。遅くて10秒を超えてしまいます。
そのほかにやったこととしては
サブスレッドで画像を取得。
collectionView.reloadDataを一定の枚数取得したら実行。
など試しましたがやはり基本の読み込みスピードからして遅い気がします。
まとめますと、アプリが落ちないように、また写真取得を高速化するにはどこを改善すれば良いでしょうか?
解決法、ヒント等いただけたら幸いです。
よろしくお願いいたします。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。