【发布时间】:2017-07-04 09:26:29
【问题描述】:
使用关于 SO 的几个答案,我们设法编写并执行了一个基本的 HTTP 请求:
import Foundation
let url:URL = URL(string: "http://jsonplaceholder.typicode.com/posts")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
let paramString = "data=Hello"
request.httpBody = paramString.data(using: String.Encoding.utf8)
let task = session.dataTask(with: request as URLRequest) {
(data, response, error) in
guard let data = data, let _:URLResponse = response, error == nil else {
print("error")
return
}
let dataString: String = String(data: data, encoding: String.Encoding.utf8)!
print("here")
print("Data: \(dataString)")
print("Response: \(response!)")
}
task.resume()
while task.response == nil {}
print("Done")
您会注意到,我们已经忙着等待,直到设置了task.response。但是,既不打印数据也不打印响应,只打印here。
经过无数次尝试以这种或那种方式包装东西后,我们确定这里有一个 Heisenbug:在代码中什么都不改变,有时会打印 here,有时什么也不打印,而且非常非常少见 dataString(更不用说 @ 987654327@).
所以我们在print("Done") 之前插入sleep(3),然后,奇迹般的,我们得到了所有的打印。
然后我们大叫了一声(我可能真的扔了一些东西),短暂地考虑过完全放弃 Swift,但随后冷静下来,像先生们一样面面相觑,然后在这里发帖。
显然,无论任何异步任务(线程?)是否仍在运行,主线程都会终止,从而杀死所有的子线程。我们如何防止这种情况发生,即“加入”线程?
额外问题: Alamofire 是否在幕后处理这个问题?
【问题讨论】:
标签: swift http asynchronous concurrency