Выполнение блока всегда задерживается - PullRequest
2 голосов
/ 28 февраля 2012

Я довольно новичок в IOS.Я хочу получить все фотографии на устройстве в viewDidLoad.но блок всегда выполняется после того, как я вызвал NSLog(@"%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];

1 Ответ

3 голосов
/ 28 февраля 2012

Как указано в документации ALAssetsLibrary , enumerateGroupsWithTypes:usingBlock:failureBlock: является асинхронным, поэтому вместо вызова на месте его планируется вызвать из следующего цикла цикла выполнения. В документации четко указано, в чем причина и как вы должны действовать:

Этот метод является асинхронным. При перечислении групп пользователю может быть предложено подтвердить доступ приложения к данным; метод, однако, возвращается немедленно. Вы должны выполнять любую работу с активами в enumerationBlock .

...