我有一个简单的应用程序,当没有互联网时它会显示一个空的tableView,从RSS加载文本。我想这样做,以便当没有互联网时,它会提供一些文字说没有可用的互联网和一个尝试重新连接的按钮。
为了做到这一点,我在this question中使用了Tony Million的Reachability类。 我在这样的函数中将布尔设置为YES和NO:
- (void)testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^
{
NSLog(@"Yayyy, we have the interwebs!");
internetConnect = YES;
});
};
// Internet is not reachable
internetReachableFoo.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^
{
NSLog(@"Someone broke the internet :(");
internetConnect = NO;
});
};
[internetReachableFoo startNotifier];
}
现在,当我尝试检查viewDidLoad函数中的boolean时,它将始终在函数完成之前返回。这是因为Reachability类在后台线程中。在继续之前,我不知道如何让我的代码等待结果。
所以我应该让我的代码等待结果,然后根据结果使tableView消失并用按钮将其更改为文本。
我想知道:
答案 0 :(得分:0)
错误......为什么不把代码放在你想要继续进入块中?你真的需要那个BOOL吗?
您也可以将网络请求包装到可访问性块中,在没有连接时返回错误,将该特定错误连接到UI。
有点伪,但你明白了。重点是只有当你想要请求时才需要连接,每次我想都不需要监控。使用eppz!reachability,您可以根据需要获得可达性状态,其中一次调用块,而不是每次可达性更改时。
此外,您可能对您尝试联系的主持人感兴趣,而不是google.com。当google.com正常运行时,您的Feed无法访问。
-(void)fetchFeed
{
[EPPZReachability reachHost:@"your.rss.host.com"
completion:^(EPPZReachability *reachability)
{
if (reachability.reachable)
{
[self hideRetryUI]; // UI
[self fetchFeed:^(Feed *feed) // Networking
{ [self showFeed:feed]; }]; // UI (probably table view reload)
}
else
{
[self showRetryUI]; // UI
}
}];
}
-(IBAction)retryTouchedUp
{ [self fetchFeed]; }
答案 1 :(得分:0)
您还可以将可达性检查为
NSInteger reachabilityStatus = 0;
reachabilityStatus = [self checkNetworkReachability];
if (reachabilityStatus) {
//network is available so perform network oriented task;
} else {
// show an alert saying network is unavailable;
}
- (NSInteger)checkNetworkReachability {
networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
if (networkStatus == NotReachable) {
NSLog(@"There IS NO internet connection");
} else {
NSLog(@"There IS internet connection");
}
return (NSInteger)networkStatus;
}