ankyy
ankyy

Reputation: 349

Want to call a function after downloading data from server in objective c

I am downloading cards from server using asynchronous request and I want the moment I finished downloading, I should be navigated to some other screen. I am downloading cards using this set of code.

   NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:[dictTemp objectForKey:@"image_1_url"],[dictTemp objectForKey:@"image_2_url"],[dictTemp objectForKey:@"image_3_url"], nil];
    for(int i=0;i< [array count];i++)
    {
        NSURL* url = [NSURL URLWithString:[array objectAtIndex:i]];
        NSURLRequest* request = [NSURLRequest requestWithURL:url];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse * response,
                                                   NSData * data,
                                                   NSError * error) {
                                   if (!error){
                                             NSString *stringName=[NSString stringWithFormat:@"downloadimage%d",i+1];
                                             UIImage *tempImage=[[UIImage alloc]initWithData:data];
                                           [self saveLocally:tempImage andNAme:stringName];
  }
                                 [self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
         }];

But the problem is, I am navigating to some other screen in update method, but it gets called before completion of asynchronous request.

I am downloading three images one by one using for loop as specified in the code, and I want to call update method after downloading all the three cards.

Thanks in advance

Upvotes: 0

Views: 77

Answers (2)

Tarek Hallak
Tarek Hallak

Reputation: 18470

You can do the below if don't want want to change:

NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:[dictTemp objectForKey:@"image_1_url"],[dictTemp objectForKey:@"image_2_url"],[dictTemp objectForKey:@"image_3_url"], nil];
NSInteger reqCounts = [array count];
    for(int i=0;i< [array count];i++)
    {
        NSURL* url = [NSURL URLWithString:[array objectAtIndex:i]];
        NSURLRequest* request = [NSURLRequest requestWithURL:url];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse * response,
                                                   NSData * data,
                                                   NSError * error) {
                                   if (!error){
                                             NSString *stringName=[NSString stringWithFormat:@"downloadimage%d",i+1];
                                             UIImage *tempImage=[[UIImage alloc]initWithData:data];
                                           [self saveLocally:tempImage andNAme:stringName];
                                           reqCounts --;
                                   }
                                   if (reqCounts == 0) {
                                         [self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
                                   }

}];

Better to check this awesome answer.

Upvotes: 1

user3283997
user3283997

Reputation:

Instead of using the NSURLRequest class, the NSSession Object is recommended in iOS7. Try rewriting your code this way.

.......
NSURL* url = [NSURL URLWithString:[array objectAtIndex:i]];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDownloadTask  *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

    NSData *data = [[NSData alloc] initWithContentsOfURL:location];


    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

    ..........
    }

    dispatch_async(dispatch_get_main_queue(), ^{

        //call your update method here

    });

Hope it helps.

Upvotes: 0

Related Questions