2011-03-23 85 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美分...