2015-08-07 2 views
1

Я хочу проверить, подключено ли устройство пользователя к Интернету или нет, прежде чем отправлять запрос на сервер. Для этого я делаю это в AppDelegate классеЛучший способ проверить подключение через AFNetworking 2 в iOS?

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    [self connectivity]; 
} 
    -(void)connectivity 
    { 
     [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){ 

     }]; 

     // Set the reachabilityManager to actively wait for these events 
     [[AFNetworkReachabilityManager sharedManager] startMonitoring]; 
    } 

и когда я сделать любой запрос я сделать

AFNetworkReachabilityStatus status = [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus; 
BOOL con = (status == AFNetworkReachabilityStatusReachableViaWiFi || status == AFNetworkReachabilityStatusReachableViaWWAN); 
//BOOL con =[AFNetworkReachabilityManager sharedManager].reachable;//give same result as networkReachabilityStatus 

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

ответ

1

Вы можете проверить свойство networkReachabilityStatus:

AFNetworkReachabilityStatus status = [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus; 
BOOL rechable = (status == AFNetworkReachabilityStatusReachableViaWiFi || status == AFNetworkReachabilityStatusReachableViaWWAN); 

Если вы хотите попробовать сделать что-л в то время как статус является AFNetworkReachabilityStatusUnknown, вы можете использовать:

BOOL rechable = (status == AFNetworkReachabilityStatusReachableViaWiFi || status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusUnknown); 

P.S.

Проверка достижимости является асинхронной операцией, см SCNetworkReachabilityRef, поэтому вы не можете получить networkReachabilityStatus в applicationDidFinishLaunching метода.

+0

Если я вызываю свой метод 'connectivity' из' applicationDidBecomeActive', как в вопросе, а затем, если я проверю 'networkReachabilityStatus', как ваше предложение, я получаю такой же результат, как' [AFNetworkReachabilityManager sharedManager] .reachable; 'и если не называть' метод connectivity', тогда я всегда получаю 'AFNetworkReachabilityStatusUnknown'. – Blios

+0

Перед проверкой _networkReachabilityStatus_ вы должны вызывать - (void) startMonitoring и ждать, пока он вызывает ваш обратный вызов. До того, как он называется вашим статусом обратного вызова, это AFNetworkReachabilityStatusUnknown. Если вы вызываете _networkReachabilityStatus_ из _ applicationDidBecomeActive_, вы всегда будете получать Неизвестно. Повторяю: «Проверка доступности - асинхронная операция» –