可达性最佳实践

Coa*_*sty 0 c iphone cocoa objective-c

我的应用程序提取了一个json数据源,我刚刚将可访问性检查添加到app delegate中的applicationDidBecomeActive.如果网络是可联系的,则加载视图控制器.从视图控制器中调用解析器类,该类填充UITableview.如果网络不可联系,则会显示警报.如果用户按下主页按钮,则激活无线或蜂窝数据,然后返回应用程序,视图控制器将被加载.虽然这有效但解决方案并不是特别优雅,因为每次用户在放入后台后返回应用程序时,视图控制器调用都会再次运行.我想知道是否有更好的选择?

AppDelegate.m

  - (void)applicationDidBecomeActive:(UIApplication *)application {

// Check for network connectivity

reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if(remoteHostStatus == NotReachable) {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Connection Error" message:@"App cannot connect to the internet" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];
    self.internetActive = NO;
}


else {

    NSLog(@"internet available");
    self.internetActive = YES;

}


// if internet available call viewcontroller;

if (self.internetActive) {
    navController.viewControllers = [NSArray arrayWithObject:viewController];
    [window addSubview:navController.view];
    [window makeKeyAndVisible];
}
else {
    //error pic background display
}
Run Code Online (Sandbox Code Playgroud)

然后是viewcontroller.m

  - (void)viewDidLoad {

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; 
[loadingActivityIndicator startAnimating];

Infoparser *cparser = [[FCO_parser alloc] init];
[cparser queryclistwithViewCont:self];
[cparser release];

[super viewDidLoad];
Run Code Online (Sandbox Code Playgroud)

}

Jon*_*nah 5

您现有的可达性检查几乎肯定会返回错误的否定结果.可达不会告诉你网络连接时肯定是一个好工作使用时或连接可能是可用,但不是一个连接可用的,或者请求会成功.

假设用户只能访问WWAN网络,并且他们的网络接口当前处于非活动状态.您创建一个新的Reachability实例,开始请求可达性通知,并立即检查-currentReachabilityStatus.这将NotReachable在几秒钟后返回,此时WWAN界面最终联机.

相反,我建议您以不同的方式考虑这个问题,并将您的数据显示与获取数据的过程分开.

当您的视图显示时,显示您拥有的此json源的任何版本,或者如果您还没有任何数据,则显示相应的消息.

当您的应用程序变为活动状态(或其他适当的事件)时,尝试获取数据源的新副本.如果此尝试失败,那么订阅reachabilityChanged通知,然后重试时可达表明网络连接可能现在可用.重复此操作,直到您成功获取数据并更新视图.

然后,您可以缓存当前版本的数据源并显示它,直到您获得更新的版本.如果您保存上次成功更新Feed的时间戳,您甚至可以选择丢弃它,如果它已经过时,或者向用户显示他们目前的Feed视图的年龄.