使用AppDelegate中的Reachibility块检查整个应用程序的连接

时间:2013-10-02 11:11:23

标签: ios objective-c reachability appdelegate connectivity

我正在开发一个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
}

就是这样。我想知道我的想法是好还是坏,如果我犯了任何错误或任何更好的建议将受到高度赞赏。提前谢谢。

2 个答案:

答案 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。