2017-01-12 42 views
0

我得到JSON数据的数量,一旦整个事情被下载或获取JSON的过程完成我需要更新的tableView如何检查NSURLSessionDataTask是否完整?

for(int i = 1;i <= self.numberOfEpisodes;i++) 
{ 
    NSString *endPoint = [[[[urlJson stringByAppendingString:getEpisodes]stringByAppendingString:title]stringByAppendingString:@"&episodeNumber="]stringByAppendingString:[NSString stringWithFormat:@"%i",i]]; 
    endPoint = [endPoint stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 
    NSLog(@"End point %@",endPoint); 
    [downloadJson:endPoint WithHandler:^(__weak id result) 
    { 
     NSArray *episodeArray =result; 
     if(episodeArray && episodeArray.count > 0) 
     { 
      for(NSDictionary *dictionary in episodeArray) 
      { 
       //parse stuff here 
      } 
     } 
     if(i == self.numberOfEpisodes) 
     { 
      //update UI 
     } 

    }]; 
} 

问题的UI是在这一行如果(i == self.numberOfEpisodes)。我不知道为什么整数没有安排从1到self.numberOfEpisodes。相反,它是从1到self.numberOfEpisodes的随机数。那么还有另一种方法来检查json的获取是否完成?

(void)getJson:(NSString *)urlString WithHandler:(void(^)(__weak id result))handler 
{ 
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; 
NSURL * url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; 

[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; 
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[urlRequest setHTTPMethod:@"GET"]; 

NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                 if(error == nil) 
                 { 
                  id returnedObject = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableLeaves error:nil]; 
                  handler(returnedObject); 
                 } 
                 else{ 
                  NSLog(@"error %@",error); 
                 } 
                }]; 
[dataTask resume]; 
} 

回答

0

是的,有通过dispatch_group_t

//Creat group 
    dispatch_group_t group = dispatch_group_create(); 

    for(int i = 1;i <= self.numberOfEpisodes;i++) 
    { 

    //Enter group 
    dispatch_group_enter(group); 

     NSString *endPoint = [[[[urlJson stringByAppendingString:getEpisodes]stringByAppendingString:title]stringByAppendingString:@"&episodeNumber="]stringByAppendingString:[NSString stringWithFormat:@"%i",i]]; 
     endPoint = [endPoint stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 
     NSLog(@"End point %@",endPoint); 
     [downloadJson:endPoint WithHandler:^(__weak id result) 
     { 

      NSArray *episodeArray =result; 
      if(episodeArray && episodeArray.count > 0) 
      { 
       for(NSDictionary *dictionary in episodeArray) 
       { 
        //parse stuff here 
       } 
      } 

    // Then Leave group 
      dispatch_group_leave(group); 

     }]; 
    } 
//Here you will be notified after it's done 

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
       // Do whatever you need to do when all requests are finished 
       //Update UI 
      }); 
实现这一目标的一种方式