質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1008閲覧

アルバムの画像をファイルサイズ順で取得したい

shoboo

総合スコア7

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/11/26 09:09

前提・実現したいこと

表題の通り、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に設定するだけでソートできるようなメソッド?は用意されているのか
  • ファイルサイズを同期的に取得してソートする方法はあるのか?
  • 上記のようなことをしなくても、他の方法でできるよ!

などご教授いただけたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Photosあまり詳しくは無いですが・・・

日付のようにoptionsに設定するだけでソートできるようなメソッド?は用意されているのか

PHAssetがファイルサイズ情報を持っていないので出来ないかと思います。

ファイルサイズを同期的に取得してソートする方法はあるのか?

あまり良い方法ではなさそうですが、requestImageDataで直Dataをリクエストする際にオプションで同期オプションを指定することができるようです。
https://stackoverflow.com/questions/38348771/phasset-get-filesize-ios

ただ、メモリや動作速度などいろんな効率が悪そうです。
(おそらくautoreleasepoolなどを仕込まないとメモリ枯渇死するのではないかと思われます。)

同期にこだわる必要がなければ、
0. 非同期でファイルサイズを取り、PHAssetとファイルサイズをタプル等で配列に溜める([(asset: PHAsset, filesize: Int)]型とかで)
0. すべて取り終わったらファイルサイズを元にソートを行い、画面に反映

などとすれば良いのではないかと思いました。

余談ですが、iCloudなどで同期した画像(端末側には実データが無いもの)とかもありますので、ご注意ください。

投稿2018/11/28 06:10

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shoboo

2018/11/28 08:23

解答ありがとうございます。 私も考えた結果、やはりメモリや動作等で問題が起きそうなので おっしゃられている通り、非同期でファイルサイズを取得・保持してソートするようにしようと思います。 > 余談ですが、iCloudなどで同期した画像(端末側には実データが無いもの)とかもありますので、ご注意ください。 ありがとうございます! 今回は端末内のみの画像なので問題ありませんが、使用する際には注意したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問