2017-05-24 10 views
1

HTTPHTTPフォーマットで電子メールとパスワードを送信するサブミットボタンがありますが、アプリケーションがサーバーからの応答を受信して​​もインジケータビューは停止しません。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() 
} 

また、私は場合には、アニメーションの継続を防止するために(ガードの前に)閉鎖の先頭にこのブロックを移動したいです応答のエラー。

関連する問題