dispatch_asyncを使ってメインスレッドでUIを更新

たとえば、あるurlからjsonデータを取得してきて結果をUITextView(self.db_list.text)に表示させようとした。

var task = NSURLSession.sharedSession().dataTaskWithURL(myUrl, completionHandler:{data, response, error in

   let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil) as! NSMutableArray

        for row in json{
            if let id:AnyObject = row["id"],
                let user_id:AnyObject = row["user_id"],
                let pw:AnyObject = row["pw"]
            {
               self.db_list.text! += "id=\(id),user_id=\(user_id),pw=\(pw)\n"
            }
        }

})
task.resume()

エラーになる。
UIパーツへのアクセスはメインスレッドで行わなければいけないのに、バックグラウンドでやろうとしたためエラーになった。
なのでdispatch_asyncを使い、第一引数にdispatch_get_main_queue()を当ててメインスレッド処理にした。

var task = NSURLSession.sharedSession().dataTaskWithURL(myUrl, completionHandler:{data, response, error in

   let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil) as! NSMutableArray
    // バックグラウンドだとUIの処理が出来ないので、メインスレッドでUIの処理を行わせる.
    dispatch_async(dispatch_get_main_queue(), {
        for row in json{
            if let id:AnyObject = row["id"],
                let user_id:AnyObject = row["user_id"],
                let pw:AnyObject = row["pw"]
            {
               self.db_list.text! += "id=\(id),user_id=\(user_id),pw=\(pw)\n"
            }
        }
    })
})
task.resume()

出来た!
参考にさせていただいた記事、感謝

コメント