Reachability想說愛你不容易

 Reachability是蘋果官方給的檢查網絡狀態的庫,想必每一個基於網絡的應用都會用它來檢查網絡狀態吧,固然筆者也不例外.但是正當自信滿滿的我,用這個庫用的不亦樂乎的時候,忽然發現我寫的基於網絡的程序工做的不是那麼流暢了,尤爲是仔細檢查之後肯定是由於用了Reachability的時候,一會兒以爲的不可理喻,這瞬間的落差讓前一分鐘還在美滋滋的認爲"寫程序是藝術,用程序是享受"的我情何以堪?緩存

這種狀況就是:鏈接到了Wifi,可是並不能上網.這時候用Reachability檢查會認爲設備處在wifi狀況下(沒錯,好像就是wifi環境下),若是這時候你至關然的認爲能夠正常上網而去獲取網絡數據的話你就等待網絡請求超時吧,而默認的超時時間彷佛有15秒之久,程序卡住這麼久在用戶體驗上不可接受的.之前的時候一直以爲Reachability挺神奇的,能夠檢查出來是wifi仍是3G網絡,還暗自想它是否是偷偷的鏈接到了哪臺服務器判斷網絡狀況,此次仔細看了下,以爲挺失敗的,它區分網絡鏈接的時候只是簡單的查看有沒有ip地址,哎.這就難怪出現覺得是wifi可是上不了網的狀況了.解決辦法呢?若是是用ASI進行http請求的話,能夠簡單設置一下超時時間能夠在必定程度上避開這個問題:[request setTimeOutSeconds:5];若是是用的NSURLRequest的話,能夠用忽略本地緩存並增長超時的方法:NSURLRequest *request = [NSURLRequest requestWithURL:url1 cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];研究到這裏,筆者忽然以爲發現了一個判斷網絡鏈接的辦法:
  
  
  
  
  1. NSURL *url1 = [NSURL URLWithString:@"http://rainbird.blog.51cto.com"]; 
  2. NSURLRequest *request = [NSURLRequest requestWithURL:url1 cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10]; 
  3. NSHTTPURLResponse *response; 
  4. [NSURLConnection sendSynchronousRequest:request returningResponse: &response error: nil]; 
  5. if (response == nil) { 
  6.     NSLog(@"沒有網絡"); 
  7. else
  8.     NSLog(@"網絡是通的"); 
簡單來講就是進行一個網絡請示並設置一下超時時間,而後根據返回結果判斷網絡鏈接.固然了你的網絡請求最好是返回很簡單的數據,請求地址最好也是你將要請求的網絡地址(你想一想:你要請求baidu的東西,判斷google的網絡鏈接性有用麼?).友情提示一下,上面一段代碼擱在主線程裏用依然會卡住界面的喲.
仔細想來Reachability並無錯.錯就錯在我把用來判斷網絡鏈接類型的東西用來判斷網絡連通性.因此合理的利用工具,作正確的事:)
相關文章
相關標籤/搜索