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
我需要从 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