可达性最佳实践

时间:2011-03-23 17:56:52

标签: iphone objective-c c cocoa

我的应用程序提取了一个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
}

然后是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];

}

2 个答案:

答案 0 :(得分:5)

您现有的可访问性检查几乎肯定会返回错误的否定结果。可达性很好地告诉您何时网络连接肯定可用或者连接可能可用而不是连接 可用或请求将成功。

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

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

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

当您的应用变为活动状态(或其他适当的事件)时,尝试获取数据Feed的新副本。如果此尝试失败,则订阅reachabilityChanged通知,并在可达性指示网络连接可能现在可用时再次尝试。重复此操作,直到您成功获取数据并更新视图。

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

答案 1 :(得分:0)

我个人的意见不是停止加载您的初始视图,而是让视图加载并妥善处理可能缺少网络连接。

至于向用户显示消息,我仍然会将其留在appDelegate作为中心位置。从那里,您可以显示带有消息/图像的模态视图控制器。这可以添加到窗口中,因此可以设置在用户当前可见的任何内容之上。

只是我的2美分......