この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
本シリーズのこれまでの記事でモデルオブジェクトの編集や削除について説明しました。 今回は編集や削除などの、フォトライブラリの変更をハンドルする方法を扱います。
モデルオブジェクトの変更のハンドリング
プロトコルに適合
フォトライブラリ上での変更を知らせてもらうには、 クラスを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処理を実行したタイミングで以下のようなダイアログが表示されます。
「元に戻す」を選択した場合
「元に戻す」 を選択すると、revertが実行されます。
「許可しない」を選択した場合
「許可しない」 を選択すると、completionHandlerのblockの引数にNSErrorオブジェクトが渡されます。 (NSErrorオブジェクトのlocalizedDescriptionは「The operation couldn’t be completed. (Cocoa error -1.)」)
まとめ
今回までの記事でPhotos Frameworkの中心的な機能について説明しました。写真やビデオを扱うアプリを開発する際にぜひ活用してみてください。
参考資料
- Photos Framework Reference
- Introducing the Photos Frameworks - WWDC 2014 Session Videos
本シリーズの記事一覧
- [iOS 8] PhotoKit 1 – Photos Frameworkの概要
- [iOS 8] PhotoKit 2 – Photos Framework – モデルオブジェクトの取得
- [iOS 8] PhotoKit 3 – Photos Framework – モデルオブジェクトのプロパティの編集
- [iOS 8] PhotoKit 4 – Photos Framework – モデルオブジェクトのコンテンツの編集
- [iOS 8] PhotoKit 5 – Photos Framework – モデルオブジェクトの削除
- [iOS 8] PhotoKit 6 – Photos Framework – モデルの変更のハンドリングとコンテンツ編集のrevert
- [iOS 8] PhotoKit 7 – Photos Framework – フォトライブラリへのアクセス許可を得る
- [iOS 8] PhotoKit 8 - UIImagePickerControllerとPhotos Frameworkを組み合わせて使う
- [iOS 8] PhotoKit 9 – Photo Editing Extensionの概要
- [iOS 8] PhotoKit 10 – Photo Editing Extensionの実装 (前篇)
- [iOS 8] PhotoKit 11 – Photo Editing Extensionの実装 (後篇)