Несмотря на то, что Reachability является хорошей проверкой первого прохода, как предлагали другие, она только проверяет отрицательный случай: невозможно установить соединение? Если брандмауэр блокирует вас, или удаленный сервер не работает, или происходит что-либо из тысячи других событий, Reachability может сказать, что система в принципе достижима (т. Е. У вас есть сетевое соединение и хост, если маршрутизируемый), но хост на самом деле не достижимо.
Так что для некоторых приложений то, что вы просите, не является необоснованным. Вы должны быть осторожны, чтобы не блокировать основной поток постоянными тестами. Вот код, который будет многократно запускать тесты в фоновом режиме:
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
__block NSHTTPURLResponse *response = nil;
__block NSError *error = nil;
dispatch_queue_t netQueue = dispatch_queue_create("com.mycompany.netQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(netQueue, ^{
while (! [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]) {
NSLog(@"Connection failed.");
}
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Connection succeeded");
});
});
dispatch_release(netQueue);
Там, где «Соединение установлено», вы можете вместо этого написать код основного потока, который выполняется при успешном соединении. Обратите внимание, что я передаю * response и * error извне блока, поэтому они также будут доступны в вашем основном потоке внутри или вне блока (при условии, что вы оставляете их в области видимости) для вашего использования.
Вы можете захотеть регулировать скорость (т.е. просто не использовать while ()), но это деталь реализации. Использование NSTimer (), как предположил Ричард, будет работать.
Наконец, даже с этим кодом вам все еще нужно обрабатывать потенциальный сбой последующего соединения. Тот факт, что он работал один раз, не означает, что соединение станет доступным через миллисекунду.