PHPhotoLibrary(译)

2017-05-08  本文已影响634人  Sunli_

PHPhotoLibrary
管理访问和更改用户的照片库的单例对象

PHAsset 代表一张图片或者一个视频(文中提到的资源).
PHAssetCollection 表示一个相册或者一个时刻,或者是一个智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等. 文中提到的资源集).
PHCollectionList 表示一组相册, 例如照片中的"年度"(里面包含按地区分类的相册), 一般使用AssetCollection就行, 跟PHAssetCollection差不多.

概述

PHPhotoLibrary的单例对象sharedPhotoLibrary代表着Photo App (照片)管理的资源的集合, 包括在本地储存的资源和iCloud上的资源(如果有的话). 你可以使用这个对象来执行你对PhotoLibrary的操作. 举个栗子: 编辑一个资源的元数据或者它的内容, 增加新的资源, 或者对资源集内部资源进行整理. 当PhotoLibrary中有资源或者资源集的内容或者元数据发生变化时会发送一个消息, 你可以通过sharedPhotoLibrary注册一个观察者并获取这个消息. sharedPhotoLibrary也可以用来验证当前App是否能访问PhotoLibrary.

对 PhotoLibrary 的更改

PHAsset, PHAssetCollection,PHCollectionList的实例对象都是不可变的. 因此, 为了修改这些对象所代表的资源或者资源集, 你应该使用sharedPhotoLibrary来执行一个包含修改内容的block. 在这个block中, 你需要创建一个修改请求对象. 创建好之后, 将这个包含修改请求的block作为参数提交到performChanges:completionHandler:performChangesAndWait:error:中. 当sharedPhotoLibrary执行了这个block之后, 会调用completion handler.

操作请求类PHAssetChangeRequest PHAssetCollectionChangeRequest PHCollectionListChangeRequest 分别与资源, 资源集对应.通过这些类,我们可以执行我们需要的操作:

如果有多个修改请求的话, 可以将他们放在一个block中, 用一次原子性更新(single atomic update atomic没有想到很好的词 请指教)来完成. 下面的代码展示了如何创建一个Asset并将其放入一个AssetCollection(相册).

+ (void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError
 
{
 
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
 
        // Request creating an asset from the image.
 
        PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
 
        // Request editing the album.
 
        PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album];
 
        // Get a placeholder for the new asset and add it to the album editing request.
 
        PHObjectPlaceholder * placeHolder = [createAssetRequest placeholderForCreatedAsset];
 
        [albumChangeRequest addAssets:@[ placeHolder ]];
        NSLog(@"%@",placeHolder.localIdentifier);
 
        if (placeHolder) {
 
            onSuccess(placeHolder.localIdentifier);
 
        }
    } completionHandler:^(BOOL success, NSError *error) {
 
        NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
 
        if (error) {
 
            onError(error);
 
        }
 
    }];
 
}

注意:
当调用performChanges:completionHandler:performChangesAndWait:error:方法时, 会弹出提示框询问用户是否允许编辑"照片"的内容(增删改之类). 如果在你的app中需要一次提交多个修改请求, 可以把它们放入一个block中.
举个栗子, 一次性在相册中增加多张图片, 可以在上面的代码中通过creationRequestForAssetFromImage:方法添加多个PHAssetChangeRequest; 编辑多张照片也可以创建多个PHAssetChangeRequest并设置每个request contentEditingOutput属性为相应的PHContentEditingOutput对象.

观察发生的修改

通过registerChangeObserver :方法注册一个观察者, 就可以知道photo library发生改变了. 当你用了fetch方法(如 fetchAssetsWithOptions :)来获取assetscollections的时候, 照片会自动将这些获取到的assetscollections的改变告诉观察者. fetch出来的assetscollections, 当它们有改变的时候. 例如, 添加或, 移除, 或者重新排列collections中的内容, 也会告诉观察者. 如果想要了解更多, 可以查看PHPhotoLibraryChangeObserver protocol.

一些方法

// 获取授权状态
+ (PHAuthorizationStatus)authorizationStatus;

// 获取授权 block为用户的授权状态
+ (void)requestAuthorization:(void(^)(PHAuthorizationStatus status))handler;

+ (PHPhotoLibrary *)sharedPhotoLibrary;

// 异步执行
- (void)performChanges:(dispatch_block_t)changeBlock completionHandler:(nullable void(^)(BOOL success, NSError *__nullable error))completionHandler;

// 同步执行
- (BOOL)performChangesAndWait:(dispatch_block_t)changeBlock error:(NSError *__autoreleasing *)error;

// 注册观察者
- (void)registerChangeObserver:(id<PHPhotoLibraryChangeObserver>)observer;

// 注销观察者
- (void)unregisterChangeObserver:(id<PHPhotoLibraryChangeObserver>)observer;
上一篇下一篇

猜你喜欢

热点阅读