如何在完成块内异步生成同步请求

时间:2014-01-24 17:56:02

标签: ios objective-c asynchronous nsurlconnection grand-central-dispatch

我目前正在使用完成块,以便能够使用以下代码检查是否存在与服务器的连接,但您可以肯定地告诉它挂起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");
         }
     }];
}

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但是因为您已经在使用sendSynchronousRequest,为什么不使用sendAsynchronousRequest

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

答案 1 :(得分:0)

您可以使用AFNetworkings Reachability支持:https://github.com/AFNetworking/AFNetworking#network-reachability-manager

答案 2 :(得分: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);
    });
}