2017-05-24 81 views
1

我有一個提交按鈕,通過JSON格式提交HTTP驗證的電子郵件和密碼,但即使應用程序收到來自服務器的響應,指示器視圖也不會停止。iOS Swift 3 - 提交後無法停止UIActivityIndi​​catorView

@IBAction func signInButtonAction(_ sender: UIButton) { 
    let validated = validateEmailAddressTextField() 
    if validated { 
     let emailAddress = emailAddressTextField.text 
     let password = passwordField.text 

     let url:URL = URL(string: "http://localhost:8080/app/user/signin")! 
     let session = URLSession.shared 

     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     request.allHTTPHeaderFields = ["Content-Type": "application/json"] 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

     let user = User(emailAddress: emailAddress!, password: password!) 
     let requestJSON = careGiver.toJSON() 

     request.httpBody = requestJSON?.data(using: String.Encoding.utf8) 
     let indicator = UIActivityIndicatorView(activityIndicatorStyle: .gray) 
     indicator.center = view.center 
     view.addSubview(indicator) 
     indicator.startAnimating() 

     DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) { 
      let task = session.dataTask(with: request as URLRequest) { 
       (
       data, response, error) in 

       guard let data = data, let _:URLResponse = response, error == nil else { 
        print("error") 
        return 
       } 
       let dataString = String(data: data, encoding: String.Encoding.utf8) 
       print(dataString) 
       indicator.stopAnimating() 
      } 
      task.resume() 
     } 
    } 
} 

當我點擊'提交'按鈕,我看到按鈕頂部的指示器視圖,但它不會停止並消失。

代碼有問題嗎?我使用的是Swift 3Xcode 8

謝謝。

回答

2

indicator.stopAnimating()

嘗試在主線程上運行這行代碼:

DispatchQueue.main.async { 
    indicator.stopAnimating() 
} 
+0

謝謝。它的工作..爲什麼我需要調用內部異步塊? – user826323

+1

Cuz與UI交互的所有內容都必須在主線程上運行。 –

+0

@ user826323你能接受我的回答嗎? –

1

網絡封閉被稱爲一個隨機線程,但UI代碼必須在僅主線程來處理。因此,所有你需要的是打電話給你indicator.stopAnimating()在主線程:

DispatchQueue.main.async { 
    indicator.stopAnimating() 
} 

而且我想這個塊移動到閉合(後衛之前)的開頭,以防止情況下,繼續動畫的錯誤迴應。

相關問題