为什么最后调用DataTaskWithRequest?

时间:2015-11-17 22:33:46

标签: ios swift swift2

我必须制作一个能够在API中恢复数据的应用程序,因为我会根据我的请求使用NSURLSession.sharedSessiondataTaskWithRequest

我设法恢复了所有信息,但我无法理解为什么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

2 个答案:

答案 0 :(得分:2)

这是因为你正在做异步请求。您的请求将在最短时间执行。在resume()之后,但不是immadietely之后。您正在task()之后执行test3,因此这会使您的异步请求失效。如果你在test3之前做过,如果你的请求在test4之前可能会很快,但你永远不会知道。

答案 1 :(得分:0)

这是异步编程的神奇之处:因为它被设计为在后台(或在不同的线程中,无论你为了这个例子而称之为什么),它在执行时间方面的优先级通常低于任何迫切需要发生,例如print("test4")

基本上,如果我要翻译你的程序如何“理解”代码

print("test3")
task.resume()
print("test4")

它将是:“print”test3“,现在恢复任务,确定它是异步的,所以我们会打电话给别人为我做这个。现在我打印”test4“你可能会看到”test2“在片刻,因为我的家伙正在照顾它“