我正在开发一个iOS应用程序,需要检查Internet连接是否可用于其中的几个ViewController类。要检查网络连接,我正在使用(Reachability library by Tony Million)。
这就是我现在正在做的事情。在需要连接检查的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中一次又一次地从循环中获取数据一样。我不确定我的代码是否做错了,所以期待专家的评论。
无论如何,我正在考虑另一种解决方案来解决这个问题并使代码更清晰,更稳定。我想知道专家是否有好方法。我想在AppDelegate中保留一个名为isNetworkConnected的BOOL变量。然后在 - (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
}
就是这样。我想知道我的想法是好还是坏,如果我犯了任何错误或任何更好的建议将受到高度赞赏。提前谢谢。
答案 0 :(得分: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
:
[self checkNetConnection];
在您要检查的任何其他viewcontroller中,只需简单地定义Bool
变量,如下所示。
bool isAvailable = [[NSUserDefaults standardUserDefaults]boolForKey:@"ISNETAVAILABLE"];
if (isAvailable) {
// do what you want to do if internet is available.
}
else {
// internet is not available.
}
希望这会对你有所帮助。
答案 1 :(得分:0)
在AppDelegate.h文件中定义1个Bool变量,并在整个类中检查此Bool。检查网络连接是否在Bool上生效。如果互联网连接无法访问,则bool为false。
并且他们检查你想要的bool。