2016-03-04 102 views
0

我正在寫一個簡單的應用程序,從web服務中獲取數據並將其顯示給用戶。我有一個標籤,一個UIViewController,我有一個代碼如下:如何繼續檢查我的Swift應用程序是否具有Internet連接?

override func viewDidLoad() { 
     super.viewDidLoad() 
     activityIndicator.hidesWhenStopped = true 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.myLabel.text = "" 
    activityIndicator.startAnimating() 
    Alamofire.request(.GET, "http://mywebservice.com/fetchData") 
     .responseJSON { response in 

      switch response.result { 

      case .Success: 
       self.activityIndicator.stopAnimating() 

       if let value = response.result.value { 
        let json = JSON(value) 
        print("JSON: \(json)") 
        let numberOfUsers = json["usersNo"] 
        self.myLabel.text = "We found \(numberOfUsers) users in database" 

       } 

      case .Failure(let error): 
       print("SWITCH ERROR") 
       print(error) 
      } 

    }  
} 

當用戶進入這個小組,他看到了活動的指標運行,直到取數據時 - 當它發生的活動指示燈消失,myLabel充滿與數據。這可以正常工作,但是當用戶在短暫的時間內沒有連接互聯網並進入面板時,獲取請求將不會返回任何數據,並且指示器會繼續移動。在這種情況下,繼續檢查互聯網連接是否存在以及是否有可能獲取數據將會很好。

我該如何繼續檢查互聯網連接是否處於活動狀態 - 如果是 - 隱藏我的活動指示器並顯示提取的數據?

回答

2

您無法知道請求是成功還是失敗,直到它結束,並且成功或失敗。當它結束時,網絡交互結束。移動stopAnimating:調用,這樣它發生的,無論成功還是失敗:

Alamofire.request(.GET, "http://mywebservice.com/fetchData") 
    .responseJSON { response in 
     self.activityIndicator.stopAnimating() 
     switch response.result { // and so on 

如果你想嘗試嘗試失敗的情況下再次嘗試,只是抽象的請求轉換成自己的函數遞歸調用自身失敗的情況下:

func doRequest() { 
    activityIndicator.startAnimating() 
    Alamofire.request(.GET, "http://mywebservice.com/fetchData") 
     .responseJSON { response in 
      self.activityIndicator.stopAnimating() 
      switch response.result { 
      case .Success: 
       // whatever 
      case .Failure(let error): 
       doRequest() // <-- try again 
      } 
    }  
} 

現在從您的viewWillAppear中調用該函數。我不認爲這是一個非常好的策略 - 事實上,我會警告你不要這樣做 - 但如果這就是你想要做的事情,那麼請繼續前進。

+0

謝謝,但它不完全是我期望的應用程序的行爲...只要用戶處於離線狀態,並且只要他檢索到互聯網連接,我就想顯示該指標,然後我想隱藏指示器並顯示新獲取的數據... – user3766930

+3

互聯網正在試錯。通過嘗試連接併成功或失敗,您知道自己是否有連接。沒有一些可以做的魔術元測試。 – matt

+0

當然:)但是當我第一次連接失敗時,我想重複這個過程(嘗試連接),直到我終於有一個連接 - 同時我想顯示指示器視圖。這是我不知道該怎麼做的部分,以及爲什麼我問這個問題的原因:) – user3766930

1

Alamofire已執行Reachablity,檢查https://github.com/Alamofire/Alamofire#network-reachability

還有一個重要的注意事項:

  • 不要使用可達性來確定網絡應該發送請求。
    • 你應該總是發送它。

在你的情況下,保持​​紡消磨有網絡問題是不是一個好的做法或User Experience

幾點建議:

  1. 當請求失敗,弄清楚什麼是錯誤第一次。如果是網絡問題,請讓EndUser知道網絡有問題並檢查網絡設置。
  2. 保存上次請求,以防萬一您想在網絡恢復時重試。
相關問題