我从json async获取数据并希望更改UILabel文本,但是文本没有任何意义。 我认为这不起作用,因为函数 changeLabel(...)在内部运行 func getJsonArray(...),但为什么以及如何这样做是正确的
class DetailViewController: UIViewController {
@IBOutlet weak var detailDescriptionLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//load data from website, and run function changeLabel for change text on UI
getJsonArray("www.domen.com/app.php?action=get_data", doItFunc: changeLabel)
}
更改UILabel文本的功能
func changeLabel(jsonArray: NSArray){
//self.detailDescriptionLabel.text = "workplease"
self.detailDescriptionLabel.text = jsonArray[0]["newText"] as! String
println(self.detailDescriptionLabel.text)
//print in console new Data, but UILabel text in simulator(and phone) not change
}
从net获取数据并运行用户函数async
的函数func getJsonArray(uri: String, doItFunc: (NSArray)->Void){
if let url = NSURL(string: uri) {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
if error != nil {
println("error: \(error.localizedDescription): \(error.userInfo)")
}else if data != nil {
if let sJson = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? Dictionary<String, AnyObject> {
let results: NSArray = sJson[jsonKey] as! NSArray
如果获取数据,则运行用户函数doItFunc(results)
doItFunc(results)
}else{
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
println("Received data:\n\(str)")
}else {
println("unable to convert data to text")
}
}
}
})
task.resume()
}
else {
println("Unable to create NSURL")
}
}
}
答案 0 :(得分:0)
解析JSON的数据任务回调位于后台线程上。您无法在后台线程上更新UI。派遣到主线程:
dispatch_async(dispatch_get_main_queue()) {
doItFunc(results)
}