在之前的使用 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];
列舉相簿中的相簿分類的執行結果 |
沒有留言:
張貼留言