请帮助我理解为什么我无法改变/传递http请求中的对象。在下面的例子中,我已声明变量&some; someVar'并在请求处理程序中对其进行了更改。但是,print语句在函数的init和结尾都返回5。
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)
}
问题:
为什么不打印出' 10'在这两种情况下?
如何更改请求处理程序中的对象?
我提前为不良术语道歉,或者这是一个奇怪的问题。我是Swift的新手,这是我的第一个Stack Overflow问题。
答案 0 :(得分:0)
1)它没有打印" 10"因为在这两种情况下
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()
放入一个单独的函数中,以说明如何调用某个函数来通知您的类已返回请求,现在可以使用它附带的数据。