2014-12-04 54 views
0

我有一個需要等待完成處理的結果返回的該值將完成處理程序內設置一個布爾函數:等到完成處理程序結束以返回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

回答

0

首先,僅僅因爲您沒有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