gpt4 book ai didi

ios - 使用 AppDelegate 中的 Reachibility block 检查整个应用程序的连接性

转载 作者:行者123 更新时间:2023-11-29 03:36:18 25 4
gpt4 key购买 nike

我正在开发一个 iOS 应用程序,需要检查它的几个 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)application:(UIApplication *)application 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
}

就是这样。我想知道我的想法是好还是坏,如果我做错了什么或者任何更好的建议将不胜感激。提前致谢。

最佳答案

尝试下面的代码。

在您的 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"];
}

应用程序didFinishLaunchingWithOptions调用此方法:

[ self 检查网络连接];

在您想要检查的任何其他 View Controller 中,只需简单定义一个 Bool 变量,如下所示。

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

if (isAvailable) {

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

}

else {

// internet is not available.

}

希望这对您有帮助。

关于ios - 使用 AppDelegate 中的 Reachibility block 检查整个应用程序的连接性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com