Где вы звоните в Reachability?

Я пытаюсь реализовать Reachability в своем приложении. У меня это в applicationDidFinishLaunching. Если у меня действительно плохое соединение и я запускаю приложение, Reachability занимает вечность и часто приводит к сбою приложения с сообщением об ошибке The application failed to launch in time.

Поэтому вместо этого я попытался поместить вызов Reachability в фоновый поток. Но когда я это делаю, я больше не получаю уведомления о доступности.

Где я должен звонить в Reachability?

Изменить:

Я добавил код доступности TonyMillions в соответствии с приведенным ниже предложением, но все еще получаю ту же ошибку application failed to load in time при очень плохих условиях сети. Чтобы воспроизвести то, что я вижу, перейдите в Settings.app -> Developer -> Network Link Conditioner, включите его и установите для него 100% потерю.

Ваше приложение все еще загружается в таком состоянии?


person bmueller    schedule 06.11.2012    source источник


Ответы (3)


Используйте проект доступности Tony Millions на Github.

https://github.com/tonymillion/Reachability

Затем в моем делегате приложения я просто вставил applicationdidfinishlaunching

self.reachability = [Reachability reachabilityForInternetConnection];

[self.reachability startNotifier];

Затем, когда статус изменится, это будет вызвано

#pragma mark - Reachability

- (void)reachabilityChanged:(NSNotification *)note {

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus];

    if (ns == NotReachable) {

        if (![self.networkAlert isVisible]) {

            if ([self networkAlert] == nil) {

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to communicate with the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
                [self setNetworkAlert:alert];
            }

            [self.networkAlert show];  
        }
    } else {

        if ([self networkAlert] != nil) {

            [self.networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
        }
    }
}
person Hackmodford    schedule 07.11.2012
comment
Наконец-то я возвращаюсь к тестированию. Я добавил код доступности TonyMillions, но по-прежнему получаю ту же ошибку application failed to load in time с очень плохими условиями сети. Попробуйте зайти в Settings.app -> Developer -> Network Link Conditioner, включите его и установите на 100% потерю. Ваше приложение все еще загружается в таком состоянии? - person bmueller; 15.11.2012

Поэтому вместо этого я поместил вызов Reachability в фоновый поток. Но когда я это делаю, я больше не получаю уведомления о доступности.

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

для выполнения в фоновом потоке:

  1. создать объект доступности,

    Достижимость * достижимость = [Достижимость досягаемостьСИменемХоста:@"www.google.com"];

  2. [достижимость startNotifier];

  3. [[NSRunLoop currentRunLoop] запустить];

Это может работать, но рекомендуется планировать уведомление в основном потоке.

person 8suhas    schedule 06.11.2012

TonyMillion помог мне решить эту проблему на GitHub.

Если вы используете его замену Reachability, все, что вам нужно сделать, это обернуть вызов startNotifier следующим образом:

dispatch_async(dispatch_get_global_queue(0,0), ^{
    [self.internetReach startNotifier];
});

Приложение обязательно запустится в плохих условиях сети, и вы все равно будете получать уведомления в основном потоке.

person bmueller    schedule 16.11.2012