daiikota
daiikota

Reputation: 133

AFImageRequestOperation wait until finished

i have a little problem with this, I'm loading an Image from a Url like this:

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

I'm trying to set an iVar UIImage *userAvatar to the response from this request, but the problem is, since its an async request I'm not getting the iVar set before my Code moves on, so my iVar is empty when I'm accessing it and passing it to another method.

Upvotes: 1

Views: 2653

Answers (2)

Shmidt
Shmidt

Reputation: 16664

You forgot to add [requestOperation start]; at the end.

Upvotes: 1

FluffulousChimp
FluffulousChimp

Reputation: 9185

That's the nature of asynchronous programming! You are going to have to redesign the dependencies on userAvatar to take into account that it's availability is nondeterministic.

So, rather than having your operation's success block simply set the userAvatar ivar, it takes care of whatever needs to happen once that image is available. For example if you want to set a UIImageView's image, then in your success block:

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

(Without knowing the details of your goals and details of your implementation, this is just a "for example...")

Upvotes: 2

Related Questions