iOS8のPhotos Kitについてのメモ

iOS8で新しく追加されるPhotos Kitについて

https://developer.apple.com/videos/wwdc/2014/

でIntroducing the Photos Frameworksのセッションを見たり

https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/Photos_Framework/index.html

を読んだ感想・メモを忘れないうちに書いた。 NDAが云々という話は、誰にでも公開されている範囲の情報なのでオッケーだと思う。

http://qiita.com/uasi/items/4d17cd1b7f83a6814c83

  • PhotoKit => Photos Framework / Photos UI Framework
  • Photos FrameworkはALAssetsLibraryを置き換えるライブラリ
  • PHAsset => 写真・動画などのメディアでread-only/Thread-safeになってる
  • PHAssetCollection => アルバムや、moment(期間指定でPHAssetを束ねるやつ)、Smart Album
  • PHCollectionList => PHAssetCollectionのリスト(フォルダのような役割)PHAssetCollectionとPHCollectionList自身を内包できる
  • PHAssetはクラスメソッドのfetchAssetsXXXで取得できる
  • 取得した結果はPHFetchResultとして同期的に高速に返ってきくる
    • idを元にfetch結果を追跡し続けることができる
    • PHFetchResultはNSArrayと似たインターフェイスで扱える(objectAtIndexなど)
    • 巨大な結果(万単位などでも)を利用する場合でもメモリを一気に消費せずに、アクセスするのに必要な分だけbatchサイズ単位で実データを取りに行く
  • Change Request API
    • PHAssetChangeRequest/PHAssetCollectionChangeRequest/PHCollectionListChangeRequestを通じて変更を行う
    • 変更を行うときにはPHPhotoLibraryのperfomChangeの引数のブロックで実行する
  • PHFetchResultが他のアプリによって変更を受けた時にはPHChangeにオブザーバーを登録し通知を受けられる
    • 追加・削除・変更・移動の通知がバックグラウンドのqueueで受け取れる
    • 変更結果はPHFetchResultChangeDetailsから参照できて元のfetch optionを元に取りなおしている
      • collectionViewを更新するデモのコードが表示されたたので見るとわかりやすい
  • PHImageManagerは画像や動画のデータを取り扱うためのクラス
    • resizeやstreamingなど用途に応じたデータの取得をリクエストできる
    • データ自体はローカルにあるかiCloudにあるかなどを意識しないで良くするために非同期APIで作られてる
    • resultHandlerは何度も呼ばれるような設計になっていて解像度の低い画像の表示が真っ先に実行できるようになってたりする(これは便利!)
    • progressの値も取得できるので動画のようなでかいデータを扱う時もユーザに進捗見せられる
  • また、PHCachingImageManagerを使うとスムーズな画像のScrollViewを簡単にサクサクを作れるようになる
    • 例えばCollectionViewのスクロール方向に応じてこれから表示される範囲で必要なサイズの画像のキャッシュ作成をリクエストして、消えていく画像たちのキャッシュをやめていくというような実装か簡単にできる
    • 受け取る引数がPHAssetなのでSDWebImageのように自前のネットワーク上の画像の扱いはできない気がする
  • 画像の変更について
    • 画像の変更についてはPHContentEditingInput/Outputというクラスでデータをやりとりする
    • 元のメディアのデータからフィルタの適用などのデータをPHAdjustmentDataという形式保存するだけでrevert可能なデータとして保存できる
    • これ、よくわからなかったけど元データはPhotos.appが保持しつつも変更に必要なパラメータはシリアライズして保存しておき、それとは別の箇所に変更後の画像を保存しておくのかな
  • Photo Editing Extension
    • iOS8から使えるApp Extensionの画像編集版
    • PHContentEditingController protocolを実装したUIViewControllerのサブクラスで実装できる
    • 専用のナビゲーションバーみたいなものがついていて普通のナビゲーションバーは利用できない
    • PHContentEditingInput/Outputを通じて変更を開始・終了する

という具合でセッションの発表が終わった。

Photos Framework、全般的にALAssetLibraryで実装面倒なfetch処理周りやリサイズ->キャッシュや更新通知の仕組みなどが改善されていて良い感じだけど、前までALAssetRepresentationのmetadataから取れてた生Exif情報を参照するインターフェイスが見当たらない・・・?純粋な撮影日を画像から取りたい場合にはどうすれば・・・?

あとALAssetsLibraryとの互換性として+ (PHFetchResult *)fetchAssetsWithALAssetURLs:options:というメソッドは存在していたので永続化されたAssetURLを持ち回しているアプリはなんとか共存していけそうな雰囲気はあった。