等到完成处理程序结束以返回BOOL?

问题描述:

我有一个需要等待完成处理的结果返回的该值将完成处理程序内设置一个布尔函数:等到完成处理程序结束以返回BOOL?

-(BOOL) fetchFeed 
{ 
...... 
    NSURLSessionDataTask *dataTask = 
    [sharedSessionMainQueue dataTaskWithRequest:req completionHandler: 
    ^(NSData *data, NSURLResponse *response, NSError *error){ 

       NSMutableArray *jsonObject = [NSJSONSerialization JSONObjectWithData:data 
       options:0 
       error:nil]; 


       dispatch_async(dispatch_get_main_queue(), ^{ 

       if(!jsonObject) 
       { 
        UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){[self dismissViewControllerAnimated: YES completion: nil];}]; 

        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Connection problem." message:@"Please check your internet connection and trying logging in again." preferredStyle:UIAlertControllerStyleAlert]; 
        [alert addAction:ok]; 
        [self presentViewController:alert animated:YES completion:nil]; 
        _internetFailed = YES; 
       } 
        else 
        { 
         _internetFailed = NO; 
        } 


       }); 

     }]; 

    [dataTask resume]; 
    return _internetFailed; 

} 

的问题是,现在_internetFailed之前返回完成处理程序的结束。我尝试将“return _internetFailed”移动到完成处理程序中,但这是不允许的。问题:我应该如何构造这个以便返回等待完成处理程序的结束?

我环顾四周,但在完成处理程序类型范例中找不到完成处理程序。还有什么其他选择?在此先感谢您的任何建议。

+0

你可以使用信号量 – Andy 2014-12-04 20:29:24

+0

@安迪谢谢,我甚至不知道那些存在。将研究它。 – 2014-12-04 20:48:24

首先,仅仅因为您没有JSON对象并不意味着连接失败,您需要实际检查返回的错误信息或运行reachability检查。或者你可能刚刚得到无效的JSON或任何其他错误。因此,在决定向用户展示什么之前,您需要检查返回的错误。

其次,这种方法被宣布为void,所以返回BOOL不是一个好主意。如果您想知道此任务的状态,请在呼叫站点的完成块中添加一些内容。通常,像这样的方法将直接返回任务,并允许在完成时处理任何其他行为。

下面是它可能是什么样子:

-(NSURLSessionDataTask *)fetchFeedWithCompletionBlock:(void (^)(NSArray *responseArray, NSError *error)completionBlock 
{ 
    .... 
    NSURLSessionDataTask *dataTask = [sharedSessionMainQueue dataTaskWithRequest:req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ 
     //Check response status. 
     //Check error. 
     NSError *JSONError; 
     NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:data 
                   options:0 
                   error:&JSONError]; 
     if (completionBlock) { // Check the completion block before calling, as calling a nil block will crash. 
      if (//Any error.) { 
       competionBlock(nil, error); 
      } 
      else { 
       completionBlock(responseArray, nil); 
      } 
     } 
    } 

    [dataTask resume]; 
    return dataTask; 
} 

然后,如果该完成返回它错误,您可以在调用现场出现错误,就像这样:

[communicator fetchFeedWithCompletionBlock:^(NSArray *responseArray, NSError *error) { 
    if (error) { 
     // Present error. 
    } 
    else { 
     // Use array. 
    } 
}]; 

此外,与类型I的任何问题建议至少仔细阅读AFNetworking的来源或直接使用它。

+0

感谢您的信息。该函数是一个布尔型 - 它是一个错字,但也要指出这一点。 – 2014-12-04 20:49:24