这里的“超时”定义有两种不同的含义。
超时如timeoutInterval
您希望在请求空闲(不再传输)超过任意时间间隔时丢弃请求。示例:您将timeoutInterval 设置为 10 秒,您在 12:00:00 开始请求,它可能会在 12:00:23 之前传输一些数据,然后连接将在 12:00:33 超时。此处几乎所有答案都涵盖了此案例(包括 JosephH、Mostafa Abdellateef、Cornelius 和 Gurpartap Singh)。
超时如timeoutDeadline
您希望在某个请求到达一个任意稍后发生的最后期限时放弃该请求。示例:您将 deadline 设置为未来 10 秒,您在 12:00:00 开始请求,它可能会尝试传输一些数据直到 12:00:23,但连接将在 12:00:10 提前超时.本案由 borisdiakur 报道。
我想展示如何在 Swift(3 和 4)中为 AFNetworking 3.1 实现这个截止日期。
let sessionManager = AFHTTPSessionManager(baseURL: baseURL)
let request = sessionManager.post(endPoint, parameters: parameters, progress: { ... }, success: { ... }, failure: { ... })
// timeout deadline at 10 seconds in the future
DispatchQueue.global().asyncAfter(deadline: .now() + 10.0) {
request?.cancel()
}
举个可测试的例子,这段代码应该打印“失败”而不是“成功”,因为在未来 0.0 秒时会立即超时:
let sessionManager = AFHTTPSessionManager(baseURL: URL(string: "https://example.com"))
sessionManager.responseSerializer = AFHTTPResponseSerializer()
let request = sessionManager.get("/", parameters: nil, progress: nil, success: { _ in
print("success")
}, failure: { _ in
print("failure")
})
// timeout deadline at 0 seconds in the future
DispatchQueue.global().asyncAfter(deadline: .now() + 0.0) {
request?.cancel()
}