7844


swiftでHTTP通信をした後にUILabelのtextを変更する時に時間が５秒程かかって、値が入れ替わっています。  
どこにそんな時間がかかっているのか、ご教授頂けませんでしょうか。  
手順としては

  1. 新規で作成したSingle View Applicationで、まず storyboard にUILabelだけを配置して、UIViewControllerにoutlet接続しました。
  2. NSURLSession.sharedSession().dataTaskWithRequest で、サーバーから"message"という文字列だけを返却するjson形式の文字列を取得
  3. 取得したデータをNSStringに変換
  4. UILabel.text で、値を設定
  5. 画面(シミュレーター)に設定した内容が表示されるまでに５〜８秒くらいかかる

の手順になります。  
4までの時間は、0.3〜0.8秒くらいで処理が終わってはいるのですが、画面に反映されるのに、なぜこんなに時間がかかっているのかが、わかりません。

何が原因なのかを教えて頂けると助かります。  
実機でもシミュレーターでも、動作時間に大差はありませんでした。

宜しくお願い致します。

[code]

    class ViewController: UIViewController {
        var start: NSDate  = NSDate()
        @IBOutlet weak var lbl: UILabel!
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            println("start=\(start)")
            self.lbl.text = "\(start)"
        }
    
        override func viewDidAppear(animated: Bool) {
    
            var request = NSMutableURLRequest(URL: NSURL(string: "https://test/my_test/test")!)
            request.HTTPMethod = "GET"
            var err: NSError?
            let task = NSURLSession.sharedSession().dataTaskWithRequest(
                request, {
                    data, response, error in
    
                    let r2 = -self.start.timeIntervalSinceNow
                    println("callback=\(r2)")
                    self.lbl.text = "callback"
                    let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
    
    
                    let r3 = -self.start.timeIntervalSinceNow
                    println("encode string=\(r3)")
                    self.lbl.text = responseString
    
    
                    let r4 = -self.start.timeIntervalSinceNow
                    println("set string=\(r4)")
            })
    
            let r1 = -start.timeIntervalSinceNow
            println("before resume=\(r1)")
            task.resume()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
[/code]

実行した時の時間を追記させていただきます。  
start=2015-03-12 10:33:30 +0000  
before resume=0.0414559841156006  
callback=0.253562986850739  
encode string=0.253834009170532  
set string=0.253944993019104

宜しくお願い致します。


CC BY-SA 3.0
2015-03-12T10:25:31.827
7839
2015-03-12T14:28:30.893
2015-03-12T11:30:36.827
8755
8755
question
swift
swiftでHTTP通信をした後にUILabelのtextを変更する時に時間がかかる


~~反映されるのに時間がかかるのは、`dataTaskWithRequest`のコールバックが実行されるスレッドの優先度が低いためです。~~

遅延の原因は分かりませんが、`UKit`のメソッドの多くはスレッドセーフではないため、メインスレッド以外から操作しようとするとおかしな挙動を引き起こすことがあります。

UIの更新はメインスレッドで行ってください。

[code]

    let task = NSURLSession.sharedSession().dataTaskWithRequest(
        request, {
            data, response, error in
    
            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
            NSOperationQueue.mainQueue().addOperationWithBlock({
              self.lbl.text = responseString
            })
    })
    
[/code]


CC BY-SA 3.0
2015-03-12T12:24:26.533
7844
2015-03-12T14:28:30.893
2015-03-12T14:28:30.893
3639
3639
7839
answer