Инженеры Apple предложили полностью полагаться на возможность повторного использования.
С SO post (источник BLOCKQUOTE)
On a WWDC talk this year the Apple engineer on stage recommended users to never base
the application internet access on the Reachability example app status. Often
reachability doesn't provide a complete information (it is based on a complex mechanism)
and the suggestion provided by the engineer was this:
1. try to do your internet connection, whatever it is the Reachability status;
then set your UI hint based on success/fail result
2. if it fails due to networking issue, then register to Reachability and retry again
when Reachability gives the green light; this is needed when you want to recover
automatically from the fail condition
3. in any case give the user the possibility to "force a retry", whatever is the
Reachability status. If it succeeds, reset your UI hint immediately.
Что я сделал?
Каждый раз, когда мне нужно сделать соединение, например
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString
stringWithFormat:@"http://myadress.com"]]];
[self performSelectorOnMainThread:@selector(responseHandler:)
withObject:data waitUntilDone:TRUE];
- (void)responseHandler:(NSData *)responseData {
if(!responseData) {
ReachabilityController *reachability = [[ReachabilityController alloc] init];
[reachability checkReachability];
return;
}
// you handle your data
}
Что происходит Eсть, достижимость будет проверяться только если соединение было не удалось. Я сделал общий механизм ReachabilityController, который касается только достижимости. Я сделал это так, чтобы я мог совершать вызовы со всех остальных контроллеров каждый раз, когда я делаю запрос.
Мой ReachabilityController.m выглядит
-(void) checkReachability {
Reachability* internetAvailable = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [internetAvailable currentReachabilityStatus];
NSString *messageText;
if (netStatus == NotReachable)
{
messageText = [NSString stringWithFormat:@"Internet access not available"];
}
else
{
Reachability *netReach = [Reachability reachabilityWithHostName:host];
NetworkStatus hostStatus = [netReach currentReachabilityStatus];
if (hostStatus == NotReachable)
{
messageText = [NSString stringWithFormat:@"Host Unreachable"];
}
else
{
messageText = [NSString stringWithFormat:@"Problem with remote service"];
}
}
NSLog(@"%@", messageText);
}
Это не приведет к сбою приложения, как вы регулируете данные «нулевые» параметра себя и, наконец, вы определить причину.
надеюсь, что это поможет!
UPDATE:
Apple, может отклонить ваше приложение, если вы покажете ложное сообщение о Интернет-соединениях. Они очень серьезно относятся к своей репутации с iphone. Если подключение к Интернету доступно, но если ваше приложение сообщит, что доступ к интернету недоступен, Это будет считаться очень серьезным
Мы нашли много тайм-аутов в нашем коде, когда мы назвали Reachability в основном потоке. Это произойдет при определенных плохих сетевых условиях. Итак, теперь мы называем это только фоновыми потоками и используем его только для уведомлений о «сети, пришедших», а не «доступном в сети». – EricS
Вы не должны _call_ Достижимость. Вы настроили его и прослушали его уведомления. –