2012-02-28 3 views
2

Я довольно новичок в 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]; 

ответ

3

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

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

+0

Спасибо, ayoy! Что делать, если мне нужно вернуть значение в enumerationBlock? И что мне делать, если мне нужно это значение в следующей функции обратного вызова делегата? – Jin

+1

Вы просто не можете этого сделать, и вам нужно как-то обойти его. См. [этот вопрос и главный ответ] (http://stackoverflow.com/questions/9474018/returning-uiimage-from-block) для получения дополнительной информации. – ayoy

Смежные вопросы