2015-07-10 37 views
0

我從json異步獲取數據,並且想要更改UILabel文本,但文本沒有可以。 我覺得這不起作用,因爲功能changeLabel(...)內 FUNC getJsonArray(...),但爲什麼和怎麼辦這是正確的函數類型作爲參數類型,如何更改此函數中的UI元素值?

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 

} 

函數來獲得淨並運行用戶功能異步數據

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(結果)

    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

數據任務回調,你解析JSON是在後臺線程。您不能在後臺線程上更新UI。發送到主線程:

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

謝謝!這行得通!!! – Gleb

相關問題