2017-07-19 4 views
0

私はAlamofire 4.4を使用します。 AlamofireのcompletionHandler内のUIを更新しますが、関数が終了するまで更新されません。私はsleep(10)を使ってテストしています。 UI更新は10秒後にのみ行われます。しかし、私は最初に更新する必要があります。Alamofire completionHandler更新UIは機能が終了したときにのみ動作します

まもなく。私はcompletionHandlerでいくつかの操作を実行し、それは時間がかかります。約10秒。私はプロセスの完了率を示したい。しかし、UIは更新されません。例:プロセスラベルの先頭には、「終了」の中央にある「処理中」の「開始」に名前を変更します。しかし、ラベルは「処理中」に変わります。ここで

は私のコードです:私のラベルのテキストの変更はわずか10秒後に "名前の変更" する

view.backgroundColor = UIColor.white 

     label.frame = CGRect(x: 50, y: 50, width: 100, height: 20) 
     label.text = "Begin" 
     label.textColor = UIColor.black 

     view.addSubview(label) 

     Alamofire.request("http://google.com").responseData(completionHandler: { 
      res in 

      if let stCode = res.response?.statusCode { 
       if stCode == 200 { 
        self.label.text = "Rename" 

        print("Rename") 

        // Here I do some processing. put sleep for test 
        sleep(10) 

        print("Should be modified 10 seconds earlier") 
       } 
      } 
     }) 

これは私のViewController's viewDidLoad()機能です。私は最初に変更する必要があります。

マイログ:

Rename (I need it to change here.) 
Should be modified 10 seconds earlier (Here label changes after 10 seconds) 
+0

あなたの質問は不明です。 –

+0

@SakirSherasiya私は私の質問を編集しました。あなたが理解していないことを教えてください –

+0

@BegmuhammetKakabayev 10秒後に何か操作をしたいですか? @SahilManchandaまもなく –

答えて

0

UIの操作は、メインスレッド上で実行するので、stCodeの== 200は、あなたの非常に次を実行すると、コメント に議論を1として

DispatchQueue.main.async { 
    self.label.text = "Rename" 
} 
+0

動作しません。私はAlamofire 4.4を使用します。 –

+0

そして私はAlamofire completionHandlerがメインスレッドで動作するところを読んでいます –

1

を使用する必要がありますラベルのテキストを変更してからこれを使用する

DispatchQueue.global(qos: .background).async { 
    ///perform your heavy task here(your 10 sec task) 
    ///Upon completion of your task then in following queue  
    DispatchQueue.main.async { 
     ///change your label text here of completion 
    } 
}