iOS在HTTP请求后更新视图需要很长时间?
我对学习iOS和Swift非常陌生,所以这里可能有一些非常基本的东西我不理解。我正在使用库以Swift发送HTTP请求。现在我刚刚掌握了创建请求和解析JSON响应的诀窍 我有一个非常简单的UI,带有一个按钮和一个iOS在HTTP请求后更新视图需要很长时间?,ios,http,swift,Ios,Http,Swift,我对学习iOS和Swift非常陌生,所以这里可能有一些非常基本的东西我不理解。我正在使用库以Swift发送HTTP请求。现在我刚刚掌握了创建请求和解析JSON响应的诀窍 我有一个非常简单的UI,带有一个按钮和一个UILabel,我想用一些JSON的结果来更新它 这是我的密码: func updateWithJson() -> Void { let req = Agent.get("http://xkcd.com/info.0.json") req.end({ (respon
UILabel
,我想用一些JSON的结果来更新它
这是我的密码:
func updateWithJson() -> Void {
let req = Agent.get("http://xkcd.com/info.0.json")
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
let json = data! as Dictionary<NSString, NSString>
// this takes almost 30 seconds to propagate to the UI...
self.updateMe.text = json["safe_title"]!
})
}
发生的情况是,您的HTTP请求正在后台线程上运行。当它调用您提供的回调时,您仍然处于该后台线程上。在iOS中,所有UI工作都必须在主线程上完成。最简单的方法是使用GCD的
dispatch\u async
如下:
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
self?.updateMe.text = json["safe_title"]!
return
}
因此,您的整个函数如下所示:
func updateWithJson() -> Void {
let req = Agent.get("http://xkcd.com/info.0.json")
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
let json = data! as Dictionary<NSString, NSString>
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
self?.updateMe.text = json["safe_title"]!
return
}
})
}
func updateWithJson()->Void{
让req=Agent.get(“http://xkcd.com/info.0.json")
req.end({(响应:NSHTTPURLResponse!,数据:Agent.data!,错误:NSError!)->中的Void
让json=data!作为字典
dispatch\u async(dispatch\u get\u main\u queue()){
[虚弱的自我]在
self?.updateMe.text=json[“安全标题”]!
返回
}
})
}
中关于
[弱自我]的一点是,你不需要创建一个。结尾处的返回
,因为这里有一个闭包,其中只有一个表达式。在这种情况下,Swift将尝试这样做,在这种情况下,这不是您想要的。发生的情况是您的HTTP请求正在后台线程上运行。当它调用您提供的回调时,您仍然处于该后台线程上。在iOS中,所有UI工作都必须在主线程上完成。最简单的方法是使用GCD的dispatch\u async
如下:
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
self?.updateMe.text = json["safe_title"]!
return
}
因此,您的整个函数如下所示:
func updateWithJson() -> Void {
let req = Agent.get("http://xkcd.com/info.0.json")
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
let json = data! as Dictionary<NSString, NSString>
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
self?.updateMe.text = json["safe_title"]!
return
}
})
}
func updateWithJson()->Void{
让req=Agent.get(“http://xkcd.com/info.0.json")
req.end({(响应:NSHTTPURLResponse!,数据:Agent.data!,错误:NSError!)->中的Void
让json=data!作为字典
dispatch\u async(dispatch\u get\u main\u queue()){
[虚弱的自我]在
self?.updateMe.text=json[“安全标题”]!
返回
}
})
}
中关于[弱自我]的一点是,你不需要创建一个。结尾处的返回
,因为这里有一个闭包,其中只有一个表达式。在这种情况下,Swift将尝试,而在这种情况下,这不是您想要的。我尝试了dispatch\u async
路由,但仍然需要一段时间。让我再试一次。我必须做dispatch\u sync
才能让它工作。好吧,我第一次肯定做错了。我把它改回了dispatch\u async
,现在它可以按需要工作了。谢谢我也遇到了这个问题,并根据您的代码修复了它,谢谢。我尝试了dispatch\u async
路由,但仍然需要一段时间。让我再试一次。我必须做dispatch\u sync
才能让它工作。好吧,我第一次肯定做错了。我把它改回了dispatch\u async
,现在它可以按需要工作了。谢谢我也遇到了这个问题,并根据您的代码修复了它,谢谢