2014-10-18 39 views
1

我打电话在refreshQuote()函数完成后刷新标签。当查看日志以查看label.text发生了什么时,我可以看到它已被替换,但视图仍然看起来相同。XCode 6 UILabel在从complition处理程序调用时不刷新文本

我从viewDidload拨打refreshQuote()。 当直接从viewDidLoad呼叫setQuoteLabel它一切正常

请帮助,现在失去希望。提前

func refreshQuote() 
{ 

    var url : String = "https://api.parse.com/1/classes/Quotes" 
    var request : NSMutableURLRequest = NSMutableURLRequest() 

    request.addValue("------", forHTTPHeaderField: "X-Parse-Application-Id") 
    request.addValue("------strong text", forHTTPHeaderField: "X-Parse-REST-API-Key") 


    request.URL = NSURL(string: url) 

    request.HTTPMethod = "GET" 

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
     var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil 

      NSLog(error.debugDescription); 

     let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary 

     if (jsonResult != nil) 
     { 
      var allResults: NSArray = jsonResult["results"] as NSArray 
      var pickedResult: NSDictionary = allResults[0] as NSDictionary 

      let q:String = pickedResult["message"] as String! 

      self.setQuoteLabel(q); 

     } else 
     { 

      // couldn't load JSON, look at error 
     } 
    }) 


} 



func setQuoteLabel (quote:String) 
{ 
    NSLog(quote) 
    quoteLabel.text = quote; 
    quoteLabel.setNeedsDisplay(); 
    NSLog(quoteLabel.text!) 

} 

回答

4

所有UI组件 由于必须从主线程进行更新,而在你的情况,你要更新最有可能从不同的线程,因为代码是异步块。

要强制的代码块在主线程中执行,你可以使用dispatch_async如下:

dispatch_async (dispatch_get_main_queue()) { 
    self.setQuoteLabel(q) 
} 
+0

谢谢,工作完美 – 2014-10-18 15:24:02

+0

在迅速的辛博尔^应该被淘汰,我认为... – tong 2014-11-12 01:40:09

+0

@tong谢谢,修正 – Antonio 2014-11-12 07:33:03