2013-10-02 4 views
0

Я разрабатываю приложение iOS, которое необходимо проверить, доступно ли подключение к Интернету или нет в его нескольких классах ViewController. Чтобы проверить подключение к сети, я использую (Reachability library by Tony Million).Использование блока Reachibility в AppDelegate для проверки возможности подключения во всем приложении

Вот что я делаю прямо сейчас. В классе ViewController, который требует проверки подключения, я использую этот код на блоки ViewDidLoad ....

Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; 
reach.reachableBlock = ^(Reachability*reach) 
{ 
    NSLog(@"REACHABLE!"); // Load offline data from core data 
}; 

reach.unreachableBlock = ^(Reachability*reach) 
{ 
    NSLog(@"UNREACHABLE!"); // Fetch data from Rest Api 
}; 

[reach startNotifier]; 

Но у меня возникли некоторые неожиданное поведение при изменении состояния сети и мое приложение в этом ViewController, как иногда выборка данные из api работают как цикл снова и снова. Я не уверен, что я сделал что-то не так в своих кодах, поэтому ожидаю комментариев от экспертов.

В любом случае, я думаю, что это альтернативное решение для решения этой проблемы и делает коды более чистыми и стабильными. Я хочу знать от экспертов, если это хороший подход. Я хочу сохранить переменную BOOL в AppDelegate с именем isNetworkConnected. Затем в - (BOOL) приложение: (UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions, я хочу запустить вышеуказанные коды и установить переменную isNetworkConnected YES/NO в этом. Таким образом, код будет выглядеть следующим образом ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; 
    reach.reachableBlock = ^(Reachability*reach) 
    { 
     NSLog(@"REACHABLE!"); 
     isNetworkConnected = YES ; 
    }; 

    reach.unreachableBlock = ^(Reachability*reach) 
    { 
     NSLog(@"UNREACHABLE!"); 
     isNetworkConnected = NO ; 
    }; 

    [reach startNotifier]; 

    // rest codes.... 
} 

Тогда в моем ViewController, я буду делать, как это ...

if(appdelegate.isNetworkConnected == YES){ 
    // Fetch data from api 
} else{ 
    // Load offline data from Core data 
} 

Вот и все. Я хочу знать, хороша или плохая моя идея, если я ошибаюсь, или любое лучшее предложение будет высоко оценено. Заранее спасибо.

+1

Проверьте этот ответ. Вы можете проверить доступность во всех viewControllers. http://stackoverflow.com/questions/1083701/how-to-check-for-an-active-internet-connection-on-iphone-sdk – nsgulliver

+0

Спасибо, я уже видел это раньше. И я использую решение выше из самого голосованного ответа. Я просто пытаюсь сделать переменную связности Gloabal в приложении, чтобы мне не нужно было использовать целые блоки снова и снова в каждом ViewController. – ayon

ответ

0

Определите 1 Bool varible в файле AppDelegate.h и проверьте этот Bool по всему классу. проверьте, нет ли сетевого соединения на Bool. Сделайте true. и если соединение с Интернетом недостижимо, bool является ложным.

и их проверить, что вы хотите.

+0

Это именно то решение, которое я описал выше в моем вопросе. Пожалуйста, проверьте мои коды и сообщите мне, если я делаю что-то неправильно. Спасибо за Ваш ответ. – ayon

1

Попробуйте мой код ниже.

В вашем AppDelegate.h сделайте способ, как показано ниже.

-(void)checkNetConnection { 

    bool success = false; 
    const char *host_name = [@"http://stackoverflow.com" 
          cStringUsingEncoding:NSASCIIStringEncoding]; 

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); 
    SCNetworkReachabilityFlags flags; 
    success = SCNetworkReachabilityGetFlags(reachability, &flags); 
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && 
    !(flags & kSCNetworkFlagsConnectionRequired); 

    [[NSUserDefaults standardUserDefaults]setBool:isAvailable forKey:@"ISNETAVAILABLE"]; 
} 

Вызов этот метод из application didFinishLaunchingWithOptions:

[самостоятельного checkNetConnection];

В любом другом диспетчере представлений, где вы хотите просто проверить, определите переменную Bool, как показано ниже.

bool isAvailable = [[NSUserDefaults standardUserDefaults]boolForKey:@"ISNETAVAILABLE"]; 

if (isAvailable) { 

    // do what you want to do if internet is available. 

} 

else { 

    // internet is not available. 

} 

Надеюсь, это вам поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^