2

私はIOSにかなり慣れていません。のデバイス上のすべての写真を取得したいviewDidLoadNSLog(@"%d", photos.count)ただし、次のようにコードを呼び出した後、ブロックは常に実行されます。このような場合はどのように処理するのですか?

__block NSMutableArray* photos = [[[NSMutableArray alloc] init] retain];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

void (^assertsEnumerator)(ALAsset *, NSUInteger , BOOL *) =  ^(ALAsset *result, NSUInteger index, BOOL *stop)
{
        if(result)
        {   
            NSLog(@"Assert name : %@", [result valueForProperty:ALAssetPropertyURLs]);         
            [photos addObject:[UIImage imageWithCGImage:[result aspectRatioThumbnail]]];   
        }
};

void (^groupEnumerator)(ALAssetsGroup*, BOOL*) = ^(ALAssetsGroup *group, BOOL *stop) {
    if(group != nil) {
        NSLog(@"Adding group %@", [group valueForProperty:ALAssetsGroupPropertyName]);
        [group enumerateAssetsUsingBlock: assertsEnumerator];
    }
};

[library enumerateGroupsWithTypes: ALAssetsGroupSavedPhotos
                       usingBlock:groupEnumerator
                     failureBlock:^(NSError * err) {NSLog(@"Erorr: %@", [err localizedDescription]);}];
[library release];
NSLog(@"%d", photos.count);
[photos release];
4

1 に答える 1

3

ALAssetsLibraryのドキュメントに記載enumerateGroupsWithTypes:usingBlock:failureBlock:されているように、非同期であるため、その場で呼び出されるのではなく、次の実行ループ サイクル内から呼び出されるようにスケジュールされています。ドキュメントには、その理由と、どのように進めるべきかが明確に記載されています。

このメソッドは非同期です。グループが列挙されると、ユーザーはデータへのアプリケーションのアクセスを確認するよう求められる場合があります。ただし、メソッドはすぐに戻ります。enumerationBlockのアセットを使用して、必要な作業を実行する必要があります。

于 2012-02-28T08:27:58.583 に答える