2012-03-14 4 views
1

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

+ (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]; 
} 

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

ответ

2

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

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

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

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

+0

Хмм, позвольте мне попытаться объяснить, у меня есть LoginView, где я помещаю свои данные для входа, если логин успешно, я передаю ответ от запроса моей модели, чтобы обрабатывать создание пользователя, модель передает пользователь возвращается к LoginView, а LoginView передает пользователю UserView, и LoginView увольняется. И он отклоняется до того, как изображение будет установлено на его значение. И есть моя проблема. – daiikota

+0

Ах. Итак, поскольку вы передаете вновь созданный пользовательский объект между «LoginView» и «UserView», вы не могли бы получить изображение асинхронно как ответственность объекта пользователя? Затем, если вам нужно предпринять некоторые действия в UserView, когда изображение доступно, вы можете использовать KVO для запуска соответствующего ответа при установке изображения аватара пользователя; поэтому, например, 'UserView' будет наблюдать' self.user.userAvatar' – FluffulousChimp

+0

О, я предположил, что ваш пользователь был модельным объектом. – FluffulousChimp

1

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