我的代码运行顺序错误。 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
。
任何人都可以帮我修复它吗?
答案 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请求,其中包含一个完成处理程序,一旦收到响应就会执行该处理程序。 你的代码实际上做的是:
这意味着一旦调用了sendAsynchronousRequest,程序就不会等待它完成并执行compltion处理程序,而是继续并打印“aerror”。这就是异步性的全部目的!
如果您希望主线程在继续执行之前等待完成处理程序的终止,我建议使用信号量或方法
sendSynchronousRequest(_:returningResponse:)
无论如何你应该使用NSURLSession而不是NSURLConnection,因为现在不推荐使用NSURLConnection了。