Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将对象从响应处理程序中传递出去_Swift_Asynchronous_Callback - Fatal编程技术网

Swift 将对象从响应处理程序中传递出去

Swift 将对象从响应处理程序中传递出去,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

请帮助我理解为什么我不能在http请求中更改/传递对象。在下面的示例中,我声明了变量“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新手,这是我的第一个堆栈溢出问题。

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

    request
    是异步的。您可能在块有机会执行之前点击了
    print
    。谢谢您的回答。我们对此深表感谢。