Ios 等待完成处理程序结束后返回BOOL?

Ios 等待完成处理程序结束后返回BOOL?,ios,objective-c,objective-c-blocks,Ios,Objective C,Objective C Blocks,我有一个函数需要等待完成处理程序的结果返回BOOL,其值将在完成处理程序中设置: -(BOOL) fetchFeed { ...... NSURLSessionDataTask *dataTask = [sharedSessionMainQueue dataTaskWithRequest:req completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){

我有一个函数需要等待完成处理程序的结果返回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\u internetFailed移动到完成处理程序中,但这是不允许的。问题:我应该如何构造它以使返回等待完成处理程序的结束


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

首先,没有JSON对象并不意味着连接失败,您需要实际检查返回的错误以获取该信息或运行可访问性检查。或者您可能只是得到了无效的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.
    }
}];

此外,对于任何类型的问题,我建议至少仔细阅读源代码或直接使用它

你可以用semaphore@Andy谢谢,我甚至不知道那些存在。我会调查的。谢谢你提供的信息。函数是一个BOOL-上面是一个输入错误,但也感谢您指出这一点。