iOS在HTTP请求后更新视图需要很长时间?

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

我对学习iOS和Swift非常陌生,所以这里可能有一些非常基本的东西我不理解。我正在使用库以Swift发送HTTP请求。现在我刚刚掌握了创建请求和解析JSON响应的诀窍

我有一个非常简单的UI,带有一个按钮和一个
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
,现在它可以按需要工作了。谢谢我也遇到了这个问题,并根据您的代码修复了它,谢谢