2014-01-15 57 views
6

我試圖讓使用the reference from here設備可用的相冊列表:ios - 獲取相冊列表的簡單示例?

到目前爲止,我有這個在我viewDidLoad中:

// Get albums 
NSMutableArray *groups = [NSMutableArray new]; 
ALAssetsLibrary *library = [ALAssetsLibrary new]; 

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { 
    if (group) { 
     [groups addObject:group]; 
    } 
}; 
NSUInteger groupTypes = ALAssetsGroupAlbum; 
[library enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:nil]; 

NSLog(@"%@", groups); 

但是,沒有添加到組陣列。我期待看到NSLog中的2個項目。

回答

4

看起來響應來自異步響應listGroupBlock,但是你的NSLog在調用之後就來了。所以組仍然是空的,並且不會在當前線程中填充。

如何在listGroupBlock中添加日誌?

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { 
    if (group) { 
     [groups addObject:group]; 
    } 
    NSLog(@"%@", groups); 

    // Do any processing you would do here on groups 
    [self processGroups:groups]; 

    // Since this is a background process, you will need to update the UI too for example 
    [self.tableView reloadData]; 
}; 
+0

登錄塊的作品。我猜這個問題就是你說的。但是如何確保在迭代其內容之前填充'groups'? – resting

+0

因爲listGroupBlock是從後臺線程(而不是你創建的線程)調用的,所以你需要對'listGroupBlock'中的組進行任何處理,我們正在記錄它。這也意味着如果您需要從'listGroupBlock'更新UI。例如,如果你在UITableView中顯示它,你還需要在'listGroupBlock'內調用'[tableView reloadData]'。合理? – ansible

+0

好的。這種方法應該也可以。謝謝。 – resting

3

對於IOS9起ALAsset庫已被棄用。相反,照片框架已經引入了一種名爲PHAsset的新資產類型。您可以使用PHAssetCollection類檢索相冊。

PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; 
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; 

PHAssetCollectionType定義了相冊的類型。您可以迭代fetchResults來獲取每個專輯。

[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {}]; 

照片框架中的相冊由PHAssetCollection表示。