我必须制作一个能够在API中恢复数据的应用程序,因为我会根据我的请求使用NSURLSession.sharedSession
和dataTaskWithRequest
。
我设法恢复了所有信息,但我无法理解为什么dataTaskWithRequest
最后被调用。
func my_connection(login: NSString, password: NSString) -> Void {
let request: NSMutableURLRequest = create_request(login, password: password)
let session = NSURLSession.sharedSession()
print("test1")
let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) -> Void in
if (data == nil) {
NSLog("Error Connection")
}
print("test2")
let res = response as! NSHTTPURLResponse!
if (my_code_HTTP(res.statusCode) == 0) {
var jsonData:NSDictionary = NSDictionary()
do {
jsonData = try NSJSONSerialization.JSONObjectWithData(data!,options:NSJSONReadingOptions.MutableContainers) as! NSDictionary
extract_data_projets(jsonData)
extract_data_activity(jsonData)
extract_data_history(jsonData)
display_board()
}
catch {
NSLog("Error")
}
my_connection_user()
my_connection_notes()
}
})
print("test3")
task.resume()
print("test4")
}
这是我在编译后得到的:
test1
test3
test4
test2
答案 0 :(得分:2)
这是因为你正在做异步请求。您的请求将在最短时间执行。在resume()
之后,但不是immadietely之后。您正在task()
之后执行test3
,因此这会使您的异步请求失效。如果你在test3
之前做过,如果你的请求在test4
之前可能会很快,但你永远不会知道。
答案 1 :(得分:0)
这是异步编程的神奇之处:因为它被设计为在后台(或在不同的线程中,无论你为了这个例子而称之为什么),它在执行时间方面的优先级通常低于任何迫切需要发生,例如print("test4")
基本上,如果我要翻译你的程序如何“理解”代码
print("test3")
task.resume()
print("test4")
它将是:“print”test3“,现在恢复任务,确定它是异步的,所以我们会打电话给别人为我做这个。现在我打印”test4“你可能会看到”test2“在片刻,因为我的家伙正在照顾它“