0

我目前正在使用完成塊能夠使用以下代碼檢查是否存在到服務器的連接,但是您可以肯定地告訴它掛起UI,因爲它是同步的。但是,通過嘗試使用dispatch_async來封裝它,您無法從異步塊內部獲得正確的返回布爾值(省略了調度代碼)。如何在完成塊內部異步執行同步請求

任何關於如何解決這個問題的指針?

代碼:

typedef void(^connection)(BOOL); 

- (void)checkInternet:(connection)block 
{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: 
           [NSURL URLWithString:@"http://www.google.com/"]]; 

    [request setHTTPMethod:@"HEAD"]; 

    //[request setTimeoutInterval:3.0]; 

    NSHTTPURLResponse *response; 

    [NSURLConnection sendSynchronousRequest:request 
         returningResponse:&response error:NULL]; 

    block(([response statusCode] == 200) ? YES : NO); 
} 

- (void)theMethod 
{ 
    [self checkInternet:^(BOOL internet) 
    { 
     if (internet) 
     { 
      NSLog(@"Internet"); 
     } 
     else 
     { 
      NSLog(@"No internet"); 
     } 
    }]; 
} 

回答

1

很多方法可以做到這一點,但你已經在使用sendSynchronousRequest爲什麼不只是使用sendAsynchronousRequest

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler: 
^(NSURLResponse *response, NSData *data, NSError *connectionError) 
{ 
    block([(NSHTTPURLResponse *)response statusCode] == 200); 
} 
]; 
+1

有時候我們會讓事情變得複雜 – klcjr89

0

與嘗試:

- (void)checkInternet:(connection)block 
{ 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
     [request setHTTPMethod:@"HEAD"]; 
     NSHTTPURLResponse *response; 
     [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; 
     block(([response statusCode] == 200) ? YES : NO); 
    }); 
} 
+0

我只是試過了,它沒有返回正確的值 – klcjr89

+0

@ troop231:你確定嗎?因爲整個代碼在dispatch_async下,所以可能它應該起作用。從方法體中刪除gcd,並檢查在調用方法時會發生什麼情況:dispatch_async(dispatch_get_global_queue(0,0),^ {[self checkInternet:^(BOOL internet) 如果(互聯網) { NSLog(@ 「Internet」); } else { NSLog(@「No internet」); } }];}); –

+0

哦,代碼工作正常,沒有GCD包裝,這使得它的異步問題沒有得到正確的布爾之外 – klcjr89