Здесь есть два разных значения определения "тайм-аут".
Тайм-аут, как в timeoutInterval
Вы хотите отбросить запрос, когда он становится бездействующим (больше не передается) дольше, чем произвольный интервал времени. Пример: вы устанавливаете timeoutInterval
на 10 секунд, вы запускаете запрос в 12:00:00, некоторые данные могут быть переданы до 12:00:23, затем соединение прекратит работу в 12:00:33. Этот случай покрыт почти всеми ответами здесь (включая Иосифа, Мостафу Абделлатеефа, Корнелиуса и Гурпартарпа Сингха).
Тайм-аут, как в 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()
}