前提・実現したいこと
表題の通り、Swiftでアルバムの画像をファイルサイズ順(昇順、降順どちらでも)で取得したいと思っています。
試したこと
日付など、PHAssetのメタデータとして取得できるものは、下記のようにoptions
を設定することでソートして取得できると思います
Swift
1photoAssets = [] 2var options = PHFetchOptions() 3options.sortDescriptors = [ 4 NSSortDescriptor(key: "creationDate", ascending: false) 5] 6 7var assets: PHFetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: options) 8assets.enumerateObjectsUsingBlock { (asset, index, stop) -> Void in 9 photoAssets.append(asset as PHAsset) 10}
しかし、ファイルサイズはメタデータとして持っていないのでsort
メソッドなどを使用してソートする必要があるかと思います。
そこで、ファイルサイズを取得する関数を用意しソートを実行しましたが、ファイルサイズの取得が同期的に行えず、ソートが行なえませんでした。
Swift
1// ソート処理 2photoAssets.sort(by: { 3 self.getFileSize(phAsset: $0) > self.getFileSize(phAsset: $1) 4}) 5 6// ファイルサイズの取得 7func getFileSize(phAsset: PHAsset) -> Int { 8 var fileSize = 0 9 var url: URL? 10 let semaphore = DispatchSemaphore(value: 0) 11 12 let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions() 13 // 下記のだと、デットロック状態になって処理が止まる 14 phAsset.requestContentEditingInput(with: options, completionHandler: { (input, info) in 15 if let input = input { 16 url = input.fullSizeImageURL 17 } 18 semaphore.signal() 19 }) 20 21 semaphore.wait() 22 if let url = url { 23 do { 24 let attr: NSDictionary = try FileManager.default.attributesOfItem(atPath: url.path) as NSDictionary 25 fileSize = Int(attr.fileSize()) 26 } catch { 27 } 28 } 29 return fileSize 30} 31
そこで
- 日付のようにoptionsに設定するだけでソートできるようなメソッド?は用意されているのか
- ファイルサイズを同期的に取得してソートする方法はあるのか?
- 上記のようなことをしなくても、他の方法でできるよ!
などご教授いただけたらと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/28 08:23