将对象传递出响应处理程序

时间:2015-10-28 00:21:06

标签: swift asynchronous callback

请帮助我理解为什么我无法改变/传递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)

}

问题:

  1. 为什么不打印出' 10'在这两种情况下?

  2. 如何更改请求处理程序中的对象?

  3. 我提前为不良术语道歉,或者这是一个奇怪的问题。我是Swift的新手,这是我的第一个Stack Overflow问题。

1 个答案:

答案 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()放入一个单独的函数中,以说明如何调用某个函数来通知您的类已返回请求,现在可以使用它附带的数据。