[iOS 8] PhotoKit 6 – Photos Framework – モデルの変更のハンドリングとコンテンツ編集のrevert

はじめに

本シリーズのこれまでの記事でモデルオブジェクトの編集や削除について説明しました。 今回は編集や削除などの、フォトライブラリの変更をハンドルする方法を扱います。

モデルオブジェクトの変更のハンドリング

プロトコルに適合

フォトライブラリ上での変更を知らせてもらうには、 クラスをPHPhotoLibraryChangeObserverに適合させます。

@interface AssetViewController () <PHPhotoLibraryChangeObserver>

オブザーバー登録

変更の通知を受け始めたいタイミングで、PHPhotoLibraryの共有オブジェクトに、オブザーバーとして登録します。

- (void)awakeFromNib
{
    [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
}

変更の通知を解除したいタイミングで、PHPhotoLibraryの共有オブジェクトから、オブザーバーとしての登録を解除をします。

- (void)dealloc
{
    [[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
}

メソッド実装

photoLibraryDidChange:メソッドを実装します。 フォトライブラリ上で発生した変更をオブザーバーに伝えるメソッドです。

引数としてPHChangeオブジェクトが渡されます。 PHChangeオブジェクトのchangeDetailsForObject:メソッドを使用すると、 指定したオブジェクトの変更内容を持つPHObjectChangeDetailsオブジェクトを取得できます。

PHObjectChangeDetailsオブジェクトのプロパティ

プロパティ名 内容
objectBeforeChanges id AssetまたはCollectionの変更前の状態を表すオブジェクト
objectAfterChanges id AssetまたはCollectionの変更後の状態を表すオブジェクト
assetContentChanged BOOL Assetのコンテンツが変更されたかどうか
objectWasDeleted BOOL フォトライブラリから削除されたかどうか

photoLibraryDidChange:メソッドの実装例

以下の例では、changeDetailsForObject:メソッドの引数にPHAssetオブジェクトを指定し、 PHObjectChangeDetailsオブジェクトのプロパティを使用して変更後のPHAssetオブジェクトを取得しています。

#pragma mark - PHPhotoLibraryChangeObserver
 
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
    // Call might come on any background queue. Re-dispatch to the main queue to handle it.
    dispatch_async(dispatch_get_main_queue(), ^{
 
        // check if there are changes to the album we're interested on (to its metadata, not to its collection of assets)
        PHObjectChangeDetails *changeDetails = [changeInstance changeDetailsForObject:self.asset];
        if (changeDetails) {
            // it changed, we need to fetch a new one
            self.asset = [changeDetails objectAfterChanges];
        }
 
    });
}

他のアプリでの変更をハンドリングする

他のアプリで行われたモデルオブジェクトへの変更についても、変更をハンドリングするために実装することは同じです。 アプリがバックグラウンドからアクティブに復帰したタイミングでphotoLibraryDidChange:メソッドが呼ばれます。

Assetのコンテンツ編集のrevert

Assetのコンテンツ編集のrevertを行う手順は、Assetを編集する時と同様です。 PHAssetChangeRequestオブジェクトのrevertAssetContentToOriginalメソッドを使用します。

- (void)revertImage
{
    // 編集処理がサポートされているかを問い合わせる
    // 引数にPHAssetEditOperationContentを指定
    if ([self.asset canPerformEditOperation:PHAssetEditOperationContent]) {
        // Assetの編集を実行
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:self.asset];
            [request revertAssetContentToOriginal];
        } completionHandler:^(BOOL success, NSError *error) {
            if (!success) {
                NSLog(@"%s Error: %@", __PRETTY_FUNCTION__, error);
            }
        }];
    }
}

コンテンツの編集やAssetの削除などを行なった時と同様に、 revert処理を実行したタイミングで以下のようなダイアログが表示されます。

ios8-photo-kit-revert-1

「元に戻す」を選択した場合

「元に戻す」 を選択すると、revertが実行されます。

ios8-photo-kit-revert-2

「許可しない」を選択した場合

「許可しない」 を選択すると、completionHandlerのblockの引数にNSErrorオブジェクトが渡されます。 (NSErrorオブジェクトのlocalizedDescriptionは「The operation couldn’t be completed. (Cocoa error -1.)」)

まとめ

今回までの記事でPhotos Frameworkの中心的な機能について説明しました。写真やビデオを扱うアプリを開発する際にぜひ活用してみてください。

参考資料

本シリーズの記事一覧