Swift 将对象从响应处理程序中传递出去
请帮助我理解为什么我不能在http请求中更改/传递对象。在下面的示例中,我声明了变量“someVar”,并在请求处理程序中对其进行了更改。但是,print语句在init和函数末尾都返回5Swift 将对象从响应处理程序中传递出去,swift,asynchronous,callback,Swift,Asynchronous,Callback,请帮助我理解为什么我不能在http请求中更改/传递对象。在下面的示例中,我声明了变量“someVar”,并在请求处理程序中对其进行了更改。但是,print语句在init和函数末尾都返回5 var someVar = 5 init () { getHtml() print(self.someVar) } func getHtml() { Alamofire.request(.GET, "https://www.google.com/") .r
var someVar = 5
init () {
getHtml()
print(self.someVar)
}
func getHtml() {
Alamofire.request(.GET, "https://www.google.com/")
.response { (request, response, data, error) in
self.someVar = 10
}
print(self.someVar)
}
问题:
print(self.someVar)
被执行之前
self.someVar = 10
这是因为您的请求是异步的。这意味着它将在完成时返回,并将触发您指定的完成块。然而,这个请求并没有阻塞您的代码,所以下一行将立即执行
2) 您更改对象的方式是正确的,并且正在工作。只是您没有看到结果,因为在更改对象之前调用了print()
。将代码更改为:
var someVar = 5
init () {
getHtml()
}
func printVar() {
print("My variable is now \(self.someVar)")
}
func getHtml() {
Alamofire.request(.GET, "https://www.google.com/")
.response { (request, response, data, error) in
self.someVar = 10
self.printVar()
}
print("My variable is still \(self.someVar)")
}
运行这段代码,你会看到,首先你会得到一行“我的变量仍然是5”,然后经过一些延迟,你会得到“我的变量现在是10”。我希望这将帮助您理解异步请求中的完成处理程序是如何工作的
我将第二个
print()
放在一个单独的函数中,以说明如何调用某个函数来通知类请求已返回,现在可以使用它附带的数据。request
是异步的。您可能在块有机会执行之前点击了print
。谢谢您的回答。我们对此深表感谢。