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