kitoko552.memo

kitoko552のメモ

PhotoKitでアルバムを新規作成する

要点

  • PHPhotoLibraryのperformChangesメソッドでアルバムを作成できる。
  • performChangeメソッドのchangeBlockにアルバム新規作成のChangeRequestを書くことで作成する。
import Photos

let changeBlock: () -> Void = {
  PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(newAlbumName)
}
            
PHPhotoLibrary.sharedPhotoLibrary().performChanges(changeBlock) { success, error in
  // Do something
}

基本的に

PhotoKitでは画像やアルバム等に何かしたの変更を施す場合は、

PHPhotoLibrary.sharedPhotoLibrary().performChanges(changeBlock: dispatch_block_t, completionHandler: ((Bool, NSError?) -> Void)?)

を使います。
このメソッドのchangeBlockに変更する内容のChangeRequestを書きます。
ChangeRequestは基本的に*ChangeRequest(*には何かしらのクラス名が入る)という名前になっています。
今回のように、AssetCollectionに何かしらの変更を加えたい場合は、PHAssetCollectionChangeRequestとなります。

今回の場合

changeBlockには以下の内容が書かれています。

PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(newAlbumName)

これは、newAlbumNameという名前でAssetCollectionを作成してくれというrequestになります。
AssetCollectionはアルバムのことだと思ってください。

performChangesのcompletionHandlerには、変更が成功したかどうかのBool値と、エラーが返ってきます。
これらの値を使って後処理を書きましょう。

注意点

PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(title: String)

に似ているメソッドとして、

PHCollectionListChangeRequest.creationRequestForCollectionListWithTitle(title: String)

があります。
これは、AssetCollectionを作るかCollectionListを作るかの違いです。
下の画像のように、写真アプリから作成したアルバムはAssetCollectionになることから、アルバムと言えば基本的にAssetCollectionの方だと思い今回は前者を紹介しました。

f:id:kitoko552:20151209123424p:plain:w400

状況によってはCollectionListを作成したい場合もあると思うのでその場合は後者のメソッドを使ってください。
使い方は同じです。

書き方の話

上の例は、人によっては少し変わった書き方に見えるかもしれません。
もちろんこの書き方は私の好みであって絶対ではありません。
Xcodeの補完に従って書くと以下のようになります。

PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
  PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(newAlbumName)
}, completionHandler: { (success, error) -> Void in
  // Do something
})

また、completionHandlerを省略すれば以下のようにも書くことができます。

PHPhotoLibrary.sharedPhotoLibrary().performChanges({ _ in
  PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(newAlbumName)
}) { success, error in
  // Do something
}

参考記事

PhotoKitの基礎概念から基本的な実装までがまとめられているので、PhotoKitについての理解が浅い方は参考にしてください。

dev.classmethod.jp