函数类型作为参数类型,如何在此函数中更改UI元素值?

时间:2015-07-10 12:30:08

标签: ios json xcode swift asynchronous

我从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")
    }
}
}

1 个答案:

答案 0 :(得分:0)

解析JSON的数据任务回调位于后台线程上。您无法在后台线程上更新UI。派遣到主线程:

dispatch_async(dispatch_get_main_queue()) {
    doItFunc(results)
}