2012-02-01 58 views
4

我使用Apple提供的示例代碼來監控可達性 - 但它仍然令我頭疼。順便說一句,我在iOS 5上運行。iOS可達性 - 緩慢和丟失通知的問題

// Initialise 

hostReach = [[Reachability reachabilityForInternetConnection] retain]; 

[hostReach startNotifier]; 

,並

-(void) updateConnectionStatus 
{ 
    // Check Internet connectivity 

    NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

    if(netStatus == NotReachable) 
    { 
     NSLog (@"updateConnectionStatus: network not reachable!"); 

     [self setNetworkAvailable:NO]; 
    } 
    else 
    { 
     NSLog (@"updateConnectionStatus: network reachable!"); 

     [self setNetworkAvailable:YES]; 
    } 
} 

而且,

//Called by Reachability whenever status changes. 
- (void) reachabilityChanged: (NSNotification *) note 
{ 
NSLog (@"reachabilityChanged"); 

    [self updateConnectionStatus]; 
} 

不忘,

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    NSLog (@"applicationWillEnterForeground"); 

    [self updateConnectionStatus]; 
} 

我一直在使用這一段時間,但我想處理在應用程序內以不平凡的方式實現可達性例如,當網絡不可用時使用緩存數據。

第一個問題是,狀態更改通知在應用程序進入前臺後纔會到達大約10秒,甚至在應用程序重新進入前臺時進行手動檢查(如上所示)以不正確的結果返回。請參閱從控制檯這個例子日誌,

2012-02-01 13:31:02.566 myapp[9807:707] applicationWillEnterForeground 
2012-02-01 13:31:02.632 myapp[9807:707] Reachability Flag Status: -- ------- networkStatusForFlags 
2012-02-01 13:31:02.634 myapp[9807:707] updateConnectionStatus: network not reachable! 
2012-02-01 13:31:02.660 myapp[9807:707] reachabilityChanged 
2012-02-01 13:31:02.662 myapp[9807:707] Reachability Flag Status: WR t----l- networkStatusForFlags 
2012-02-01 13:31:02.663 myapp[9807:707] updateConnectionStatus: network reachable! 

我曾經嘗試都,

hostReach = [[Reachability reachabilityWithHostName:@"www.apple.com"] retain]; 

,並

hostReach = [[Reachability reachabilityForInternetConnection] retain]; 

這意味着,如果網絡是不可到達時,應用程序最後運行,一旦應用程序再次通過網絡連接運行,恢復效率可能會降低。

這個延遲是不可避免的嗎?

我的另一個問題是,我的應用顯然有時不會收到這些通知。這似乎發生在我的應用程序已經在後臺一段時間了 - 儘管我無法隨意重新創建它。

但有時,當我回來的應用程序,它收到的最後一份通知是,網絡是不可到達的,它顯然並沒有看到一個網絡可達的通知:-(

其他人看到這樣的事情?

感謝。

回答

0

要回答我的問題,呼籲updateConnectionStatus一個單獨的線程似乎已經解決了這個問題(它似乎更可靠地返回正確的狀態),但說實話,我不知道爲什麼。

延遲通知仍然是一個麻煩。