2014-01-15 6 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'内のグループに対しては処理を行う必要があります。これはまた、UIを 'listGroupBlock'から更新する必要がある場合にも意味します。たとえば、UITableViewに表示する場合、 'listGroupBlock'内で' [tableView reloadData] 'を呼び出すこともできます。理にかなっている? – ansible

+0

そのアプローチもうまくいくはずです。ありがとう。 – resting

3

IOS9以降ALAssetライブラリは廃止されました。代わりにPHAsetという新しいアセットタイプがPhotos Frameworkに導入されました。 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で表されます。

関連する問題