2011-03-23 84 views
0

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

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]; 

}

+0

您确定viewDidLoad方法实际上是否被调用?NSLog(@“VC called”);我不确定你想要优化什么,因为无论如何你的视图必须在应用程序被唤醒时加载。 – Rayfleck 2011-03-23 18:17:26

回答

5

您现有的可达性检查,几乎肯定会返回假阴性结果。可达性很好地告诉你什么时候网络连接肯定是而不是可用,或者当连接可能可用但不是连接可用或请求会成功。

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

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

当您的视图出现时,显示此JSON订阅源的任何版本,如果您还没有任何数据,则显示相应的消息。

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

然后,您可以缓存数据馈送的当前版本并显示它,直到获得更新的版本。如果您保存了上次成功更新Feed的时间戳,则甚至可以选择放弃该时间戳,只要该时间戳足够过时或向用户显示当前Feed的视图有多大。

0

我个人的意见是不要停止你的初始视图的负荷,但是,相反,让查看负载并适当地处理可能缺少网络连接。

只要向用户显示消息,我仍然会将其作为中心位置放在appDelegate中。从那里,你可以显示一个模式的视图控制器与消息/图像。这可以添加到窗口,因此可以设置在用户当前可见的任何内容之上。

只是我的2美分...