en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

12.12.2012

使用 ALAssetsGroup 列舉裝置相簿中的所有資料


在之前的使用 AssetsLibrary 取得圖庫中檔案的相關資訊文章中,我們使用 UIImagePickerController 來替我們列舉相簿中的所有資料,並且以圖形化的介面呈現這些資料供使用者瀏覽點選,實作起來也相當容易,但是,如果我們想要自動取得多筆資料做篩選時,那又該怎麼做?這時你就可以使用 ALAssetsGroup 來列舉你 Album 的所有資料並且一一做篩選,當然 UIImagePickerController 它也是這麼做的。

在開始之前請先替您的專案加上 AssetsLibrary.framework,並且在對應的類別中引用此標頭檔。替專案加入 Framework 的方法請參考Xcode 4 新增 Framework 的方法一文。


基本邏輯
在開始實作列舉相簿內所有資料之前,先來了解一下它們之間的結構關係與對應的宣告型態。

相簿(ALAssetsLibrary)--> 相簿分類(ALAssetsGroup)--> 檔案(ALAsset)


  • ALAssetsLibrary
ALAssetsLibrary,指的就是整個相簿,如果你有檔案絕對路徑,就可以使用它直接將檔案撈出來,文章一開始所提及的範例一樣,透過 UIImagePickerController 來取得檔案的絕對路徑。

  • ALAssetsGroup
ALAssetsGroup,代表著相簿內的分類,你可以使用 valueForProperty: 方法函式取得一些該分類的詳細資料,像是分類名稱或是路徑等等,當然
ALAssetsGroup 本身也記載著有多少檔案在該分類項目中。 

  • ALAsset
ALAsset,就是指檔案本身了,它同樣可以使用 valueForProperty: 方法函式取得一些詳細資料,像是檔案的類型、地點、日期等等,另外,ALAssetRepresentation 也是取得該檔案詳細資料的一種方法,詳見使用 AssetsLibrary 取得圖庫中檔案的相關資訊一文。


製作 Block 區塊
在實作此範例上,我們會使用到 3 個不同的 Block 區塊,分別是 ALAssetsLibraryGroupsEnumerationResultsBlock、ALAssetsGroupEnumerationResultsBlock 與 ALAssetsLibraryAccessFailureBlock,由於 Block 區塊在宣告時的先後順序很重要,下列程式碼我們將從最底層的「從分類中取得檔案」的 Block 區塊開始實作,接著才是「從相簿中取得分類」的 Block 區塊。
//從分類中取得檔案
ALAssetsGroupEnumerationResultsBlock groupEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if (result != nil) {

        //只取得圖片資料
        if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {

            //取得圖片
            UIImage *image=[UIImage imageWithCGImage:result.thumbnail];

            //使用 ALAssetRepresentation 取得詳細資料
            ALAssetRepresentation *representation = [result defaultRepresentation];
        }

    } else {
        //列舉完成時的處理常式

    }
};

在上述程式碼中,我們使用 ALAssetPropertyType 參數來過濾我們所要取得的檔案類型,檔案的類型目前有三種可以選擇,ALAssetTypePhoto(照片)、ALAssetTypeVideo(影片)和 ALAssetTypeUnknown(未知)。

//從相簿中取得分類
ALAssetsLibraryGroupsEnumerationResultsBlock libraryEnumerationBlock = ^(ALAssetsGroup *group, BOOL *stop) {
    if(group != nil) {
        NSLog(@"名稱: %@, 數目: %d ",[group valueForProperty:ALAssetsGroupPropertyName], [group numberOfAssets]);

        //呼叫從該分類項目中列舉檔案的Block
        [group enumerateAssetsUsingBlock:groupEnumerationBlock];

    } else {
        //列舉完成時的處理常式

    }
};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
    //失敗處理常式
};


ps:Block 為 iOS 4.0 SDK 開始有的技術, 請參考 Blocks!你不得不學習的 iOS 4 coding 新技術!一文,或是前往 iOS Developer Library 獲得更多資訊。


列舉相簿中的所有資料
最後,你可以使用以下程式碼呼叫上述製作的 Block 區塊,來列舉相簿中的所有資料。
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:libraryEnumerationBlock failureBlock:failureBlock];

列舉相簿中的相簿分類的執行結果






沒有留言:

張貼留言