AFImageRequestOperation дождитесь окончания - PullRequest
1 голос
/ 14 марта 2012

У меня есть небольшая проблема с этим, я загружаю изображение с URL, как это:

+ (void)getImageFromURL:(NSString *)imageFilename urlMode:(NSString *)mode block:(id (^)(UIImage *responseImage))aImage {

    NSURL *url = [NSURL URLWithString:[mainURL stringByAppendingString:mode]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"GET"];

    AFImageRequestOperation *requestOperation = [AFImageRequestOperation imageRequestOperationWithRequest:request
                                                                              imageProcessingBlock:nil
                                                                                         cacheName:nil
                                                                                           success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
                                          {
                                              aImage(image);
                                          }
                                                                                           failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
                                          {
                                              // manage errors
                                          }];
    [[[NSOperationQueue alloc]init] addOperation:requestOperation];
}

Я пытаюсь настроить iVar UIImage * userAvatar на ответ на этот запрос, но проблема в том, что, поскольку это асинхронный запрос, я не получаю набор iVar до того, как мой код переходит, поэтому мой iVar пуст когда я получаю к нему доступ и передаю его другому методу.

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Такова природа асинхронного программирования! Вам придется изменить дизайн зависимостей на userAvatar, чтобы учесть, что его доступность недетерминирована.

Таким образом, вместо того, чтобы иметь блок успеха вашей операции, просто установите userAvatar ivar, он позаботится о том, что должно произойти, когда это изображение станет доступным. Например, если вы хотите установить изображение UIImageView, то в вашем блоке успеха:

dispatch_async(dispatch_get_main_queue(), ^{
    myImageView.image = image;
});

(Не зная деталей ваших целей и деталей вашей реализации, это просто "например ...")

1 голос
/ 01 декабря 2012

Вы забыли добавить [requestOperation start]; в конце.

...