たとえば、ある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()
出来た!
参考にさせていただいた記事、感謝
コメント