javaSEがiOSアプリデザイン、開発に挑む日記

本業java SEがswift、デザインの勉強したことを残しておくブログ

NSURLSessionの後処理にラベル更新処理書いたらダメ

ちゃんと理解して使っていないからこうなるんですが

引っかかったのでメモ

 

JSONで天気情報をAPIで取得して画面表示

を検討して色々やっていたら

ちゃんとコンソールのログで取得できているのに

画面表示には数十秒遅れて反映される現象が...

 

        let url = NSURL(string: self.urlString + param)!
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)

        let task = session.dataTaskWithURL(url) {
            (data: NSData!, response: NSURLResponse!, error: NSError!) in
        
            // リソースの取得が終わると、ここに書いた処理が実行される
            var json:JSON = JSON(data: data)

            weatherMain = json["list"][0]["weather"][0]["main"].asString!
            self.lblDtlweather.text = weatherMain

            // ロードが完了したので、falseに
            self.isInLoad = false

            session.invalidateAndCancel()
            
        }
        task.resume()
        
        while isInLoad {
            usleep(10)
        }

 

 

ラベルのテキストを書き換える情報を

taskの処理から出してあげるとうまく更新される。

 

        let url = NSURL(string: self.urlString + param)!
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)

        let task = session.dataTaskWithURL(url) {
            (data: NSData!, response: NSURLResponse!, error: NSError!) in
        
            // リソースの取得が終わると、ここに書いた処理が実行される
            var json:JSON = JSON(data: data)

            weatherMain = json["list"][0]["weather"][0]["main"].asString!

            // ロードが完了したので、falseに
            self.isInLoad = false

            session.invalidateAndCancel()
            
        }
        task.resume()
        
        while isInLoad {
            usleep(10)
        }

        lblDtlweather.text = weatherMain

 

NSURLSessionの処理の中に

画面処理は書いちゃダメなんですね。

「self」指定が必須になるし。

非同期になるから何かしら競合しているのかな...