Постоянно вызывая метод - PullRequest
0 голосов
/ 22 января 2012

Итак, у меня есть метод, который проверяет подключение к интернету, но только во время метода -(id):init. Могу ли я настроить его так, чтобы он постоянно проверял соединение? Если это поможет, вот код:

- (id) checkConnected
    {

        NSError *error = nil;
        NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"] encoding:NSASCIIStringEncoding error:&error];
        if (URLString != NULL)
            {
                connected = YES;
            }
        else connected = NO;

        if(connected == YES)
            NSLog(@"Connected");
        else if (connected == NO)
            NSLog(@"NotConnected");

        return self;
    }

1 Ответ

0 голосов
/ 23 января 2012

Несмотря на то, что 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 (), как предположил Ричард, будет работать.

Наконец, даже с этим кодом вам все еще нужно обрабатывать потенциальный сбой последующего соединения. Тот факт, что он работал один раз, не означает, что соединение станет доступным через миллисекунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...