天天看點

iOS開發之AssetsLibrary架構使用(一)

一、引言

   AssetsLibrary架構是專門用來操作相冊相關資源的一個架構,其是iOS4到iOS9之間常使用的一個架構,在iOS9之後,系統系統了Photos架構代替了AssetsLibrary架構,但是AssetsLibrary架構依然可以使用,并且其結構和設計思路依然值得我們進行分析學習。

二、概述

   AssetsLibrary架構會作業系統的相冊,是以首先需要進行權限的申請,在使用之前,首先需要在Info.plist檔案中添加如下鍵值:

Privacy - Photo Library Usage Description

AssetsLibrary架構中核心的類關系如下圖所示:

iOS開發之AssetsLibrary架構使用(一)

三、ALAssetsLibrary資源庫對象

   ALAssetsLibrary類用來建構資源庫對象,這個對象用來整體作業系統的相冊資源,在使用它之前我們可以使用下面的方法來擷取使用者的授權情況:

+ (ALAuthorizationStatus)authorizationStatus;

ALAuthorizationStatus枚舉定義了使用者的授權情況,定義如下:

typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {

   ALAuthorizationStatusNotDetermined, // 使用者尚未選擇是否授權

   ALAuthorizationStatusRestricted,    //應用尚未授權

   ALAuthorizationStatusDenied),       // 使用者拒絕授權

   ALAuthorizationStatusAuthorized     // 使用者已經授權

}

如果使用者尚未授權過,那麼任何通路操作都将觸發授權機制。

   資源庫中的資源資料是以組的方式進行存儲,下面代碼示例了擷取資源組的方式:

   _library = [[ALAssetsLibrary alloc]init];

   [_library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

       if (group) { // 周遊相冊還未結束

           // 設定過濾器

           [group setAssetsFilter:[ALAssetsFilter allPhotos]];

           if (group.numberOfAssets) {

               NSLog(@"%@",group);

           }

       } else { // 周遊結束(當group為空的時候就意味着結束)

               NSLog(@"沒有相冊清單了");

       }

   } failureBlock:^(NSError *error) {

       NSLog(@"失敗");

   }];

上面示例的枚舉函數用來根據參數類型擷取資源組,ALAssetsGroupType參數決定擷取組的類型,可選值枚舉如下:

enum {

   ALAssetsGroupLibrary     ,// 編輯庫

   ALAssetsGroupAlbum       ,//相冊庫

   ALAssetsGroupEvent       ,//事件庫  

   ALAssetsGroupFaces       ,// iTunes同步

   ALAssetsGroupSavedPhotos ,// 儲存的相片

   ALAssetsGroupPhotoStream ,// The PhotoStream album.

   ALAssetsGroupAll         ,//所有庫

};

枚舉過程中,我們可以過去到ALAssetsGroup類型的對象,這個對象中封裝了相片資源資訊,後面會介紹。

   下面列舉了ALAssetsLibrary中其他常用的方法:

//直接通過URL來擷取資源

- (void)assetForURL:(NSURL *)assetURL resultBlock:(ALAssetsLibraryAssetForURLResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;

//直接通過URL來擷取資源組

- (void)groupForURL:(NSURL *)groupURL resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;

//向相冊庫中添加一個新的資源組 可以自定義名稱

- (void)addAssetsGroupAlbumWithName:(NSString *)name resultBlock:(ALAssetsLibraryGroupResultBlock)resultBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock;

//向相冊中寫入一張圖檔 orientation參數設定圖檔的方向

/*

typedef NS_ENUM(NSInteger, ALAssetOrientation) {

   ALAssetOrientationUp ,            // 向上 預設的

   ALAssetOrientationDown ,          // 向下

   ALAssetOrientationLeft ,          // 向左

   ALAssetOrientationRight ,         // 向右

   ALAssetOrientationUpMirrored ,    //

   ALAssetOrientationDownMirrored ,  // horizontal flip

   ALAssetOrientationLeftMirrored ,  // vertical flip

   ALAssetOrientationRightMirrored , // vertical flip

*/

- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;

//向相冊中寫入一張圖檔 并可以設定圖檔的中繼資料

- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;

//向相冊中寫入圖檔資料 并可以設定中繼資料

- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;

//将某個路徑的視訊寫入相冊中

- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock;

//檢查路徑中的視訊是否和相冊相相容

- (BOOL)videoAtPathIsCompatibleWithSavedPhotosAlbum:(NSURL *)videoPathURL;

當資源庫改變時,系統會發出如下通知:

//資源庫改變的通知

extern NSString *const ALAssetsLibraryChangedNotification;

通知中傳遞的資訊中包含如下字段:

//資源庫更新

extern NSString *const ALAssetLibraryUpdatedAssetsKey;

//插入組

extern NSString *const ALAssetLibraryInsertedAssetGroupsKey;

//更新組

extern NSString *const ALAssetLibraryUpdatedAssetGroupsKey;

//删除組

extern NSString *const ALAssetLibraryDeletedAssetGroupsKey;

下面列舉了操作過程中的一些異常定義:

   ALAssetsLibraryUnknownError =                 -1,      // 未知錯誤

   ALAssetsLibraryWriteFailedError =           -3300,      //寫入錯誤

   ALAssetsLibraryWriteBusyError =             -3301,      // 寫入繁忙 可以重試

   ALAssetsLibraryWriteInvalidDataError =      -3302,      // 無效資料

   ALAssetsLibraryWriteIncompatibleDataError = -3303,      // 不相容的資料

   ALAssetsLibraryWriteDataEncodingError =     -3304,      // 資料編碼錯誤

   ALAssetsLibraryWriteDiskSpaceError =        -3305,      // 記憶體不足

   ALAssetsLibraryDataUnavailableError =       -3310,      // 資料不可用

   ALAssetsLibraryAccessUserDeniedError =      -3311,      // 權限錯誤

   ALAssetsLibraryAccessGloballyDeniedError =  -3312,      // 權限錯誤