これは、PhotoLibrary からすべてのアセットを取得する関数です。
// MARK: Album photos
func getPhotos() {
ImageManger.photoAuthorization { (granted: Bool) in
if granted {
// Asynchronous get photos, avoid taking the main thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
self.photoGroups = ImageManger.photoLibrarys()
if self.photoGroups?.count == 0 {
return
}
let group = self.photoGroups?[0]
self.photoAssets = ImageManger.photoAssetsForAlbum(group!)
for asset: PHAsset in self.photoAssets! {
ImageManger.imageFromAsset(asset, isOriginal: false, toSize: CGSize(width: 150, height: 150), resultHandler: { (image: UIImage?) in
guard image != nil else {
return
}
self.photos.append(image!)
})
}
dispatch_async(dispatch_get_main_queue(), {
// Reload data
self.albumCollection.reloadData()
})
})
} else {
self.presentAccessRestrictedMessage()
}
}
}
そのまま呼び出しgetPhotos()
、アプリがフォアグラウンドに入ったときにも呼び出して、アセットがキャプチャされた場合に同期します。それはかなりうまくいきます。viewWillAppear
TabViewController
getPhotos
問題は、PhotoLibrary に 500 以上のアセットがある場合、読み込みに数秒かかることです。その時までに、アプリを閉じて再び開くと、またはタブを切り替えて同じコントローラーに戻ると、つまり強制的getPhotos()
に呼び出すと、photos
配列がめちゃくちゃになります!
クロージャーがまだ実行されているときに を呼び出すgetPhotos()
と、配列要素が複製されます。どうすればこの状況に対処できますか?