UIView 元素未更新

UIView element not updating

我需要从 API 获取数据 我使用了调试原理,这些打印几乎立即打印出来,包括从 API 获取的信息,但是当我尝试将此信息显示到ViewController 中的用户这需要大约 30 秒才能显示。

我会从API这里获取信息

func httpGet(request: NSURLRequest!, callback: (NSData?, String?) -> Void) {
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if error != nil {
            callback(nil, error.localizedDescription)
        } else {
            callback(data, nil)
        }
    }
    task.resume()
}

我调用请求和return一个用于调试的字符串

func loadSchedule() {
    httpGet(request) {
        (data, error) -> Void in
        onComplete(“Milo Cesar”)
}

这里我会把数据显示给用户

@IBAction func settingsButtonPress(sender: AnyObject) {
    println("Settings Button Pressed: Invoking Schedule")
    Schedule().loadSchedule(){
        (scheduleData) in
        println("Found Schedule: Setting Title to \(scheduleData)")
            self.settingsButton.setTitle(scheduleData, forState: UIControlState.Normal)
    }
}

从我的控制台中的“按下设置按钮:调用计划”语句到我得到“找到计划:Milo Cesar 的设置标题”的整个过程不到一秒钟。
由于该名称已显示在该控制台日志中,因此我认为信息已加载。尽管按钮最多需要 35 秒才能更改其标题。

为什么我的 UIButton 在检索数据后需要这么长时间才能更新它的标题?

您确定要在主线程中更新它的标题吗?尝试将其包装在 GCD

dispatch_async(dispatch_get_main_queue()){
    self.settingsButton.setTitle(scheduleData, forState: UIControlState.Normal)
}

编辑

它修复了它,因为所有 UI 相关的事情都必须由主线程执行,这是直接来自 Apple 的限制。您可以使用后台线程执行长时间任务(下载数据、执行长时间计算或对大型数组进行排序),但需要在屏幕上显示的所有内容都必须由主线程执行(表格视图重新加载、动画、将文本插入标签)。

这里还有一篇关于 GCD 及其功能的精彩教程:http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1