Swift 以错误顺序执行的代码

Swift 以错误顺序执行的代码,swift,Swift,我的代码以错误的顺序运行。aerror是在开头打印的,应该在结尾打印 这是我的密码 var aerror :Int? NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: url), queue: NSOperationQueue.mainQueue(), completionHandler: { (res, data, error) -> Void in let str = NSString(data: da

我的代码以错误的顺序运行。
aerror
是在开头打印的,应该在结尾打印

这是我的密码

var aerror :Int?
NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: url), queue: NSOperationQueue.mainQueue(), completionHandler: { (res, data, error) -> Void in

        let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("\n********\nData\n*******")
        print(str)
        print("\n********\nData\n*******")
        let json = JSON(data: data!)

        aerror = json["Logon"]["error"].int!
        print("\n********\njson\n*******")
        print(json)
        print("\n********\njson\n*******")
    })
    print("\n********\naeeror=\(aerror)")
这是输出


我不知道为什么要先打印
错误。
我想在返回之前打印
a错误

谁能帮我修一下吗

NSURLConnection.sendAsynchronousRequest
将启动一个异步请求。这意味着在调用它的那一刻无法判断它何时完成,一旦调用它,将执行下一个语句

异步请求完成后,将运行您传递给它的方法(completionHandler)

简单地说,正在发生的是:

->调用
sendAsynchronousRequest
(使用completionhandler)

->
print(“\n*********\naeeror=\(aerror)”)
(异步请求正在后台运行)

->异步请求完成

->
completionHandler
已执行

因为您在完成处理程序中分配了一个错误,所以您也可以从完成处理程序中打印它

var aerror :Int?
NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: url), queue: NSOperationQueue.mainQueue(), completionHandler: { (res, data, error) -> Void in

        let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("\n********\nData\n*******")
        print(str)
        print("\n********\nData\n*******")
        let json = JSON(data: data!)

        aerror = json["Logon"]["error"].int!
        print("\n********\njson\n*******")
        print(json)
        print("\n********\njson\n*******")

        print("\n********\naeeror=\(aerror)")
    })

一切正常。。。 NSURLConnection.sendAsynchronousRequest方法名称发送一个Asynchronows请求,该请求带有一个完成处理程序,该处理程序将在收到响应后执行。 您的代码实际做的是:

  • 创建请求
  • send it在不同的线程上移动“发送”、“等待”和“管理响应(这意味着运行完成处理程序)”的整个过程
  • 主线程上的打印错误
  • 这意味着一旦调用sendAsynchronousRequest,程序就不会等待它完成并执行compltion处理程序,而是继续运行并打印“aerror”。这就是异步的全部目的

    如果希望主线程在继续执行之前等待完成处理程序的终止,我建议使用信号量或方法

    sendSynchronousRequest(_:returningResponse:)
    

    无论如何,您应该使用NSURLSession而不是NSURLConnection,因为最后一个已不推荐使用。

    这不是错误,而是功能;-)SendAsynchronousRequest如果您想更好地理解异步与同步,请看这里:我想返回一个错误,您能告诉我如何使用NSURLSession同步处理它吗?非常感谢你!
    sendSynchronousRequest(_:returningResponse:)