代码以错误的顺序执行

时间:2015-11-05 09:40:45

标签: swift

我的代码运行顺序错误。 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)")

这是输出

aeeror=nil

********
Data
*******
Optional({"func":"LogonJs","Logon":{"error":2}})
********
Data
*******
********
json
*******
{
  "Logon" : {
    "error" : 2
  },
  "func" : "LogonJs"
}

********
json
*******

我不知道为什么首先打印aerror。 我想在退回之前打印aerror。 任何人都可以帮我修复它吗?

2 个答案:

答案 0 :(得分:2)

NSURLConnection.sendAsynchronousRequest将启动异步请求。这意味着没有办法告诉它何时会在被调用时完成,一旦被调用,下一个语句就会被执行。

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

简单来说,发生了什么:

- >调用sendAsynchronousRequest(带有完成处理程序)

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

- >异步请求完成

- > completionHandler已执行

因为你在完成处理程序中分配了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)")
    })

答案 1 :(得分:1)

一切都很好...... 如上所述NSURLConnection.sendAsynchronousRequest ub方法名称发送一个asyncronows请求,其中包含一个完成处理程序,一旦收到响应就会执行该处理程序。 你的代码实际上做的是:

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

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

    sendSynchronousRequest(_:returningResponse:)
    

    无论如何你应该使用NSURLSession而不是NSURLConnection,因为现在不推荐使用NSURLConnection了。