#ios #swift #timeout
#iOS #swift #тайм-аут
Вопрос:
Я хочу отобразить сообщение «Ошибка сети», если после 10 секунд попытки подключения вход в систему не удался.
Как я могу остановить функцию входа в систему через 10 секунд и отобразить это сообщение об ошибке?
Я использую AlamoFire.
У меня нет полной реализации, но это скелет того, как я хочу, чтобы моя функция вела себя:
func loginFunc() {
/*Start 10 second timer, if in 10 seconds
loginFunc() is still running, break and show NetworkError*/
<authentication code here>
}
Комментарии:
1. Обновите свой вопрос соответствующим кодом, для которого вы хотите установить тайм-аут.
2. Обновлен скелет функции.
3. Обновите свой вопрос вашим фактическим рабочим кодом, который вам нужно обновить с таймаутом.
4. У меня пока нет полного рабочего кода. В любом случае, какое значение имеет полный код? Это будет просто вызов базы данных, чтобы проверить, является ли комбинация пользователя и пароля точной.
5. Существует тысяча способов выполнения сетевых вызовов, поэтому возможность установить тайм-аут зависит от того, как вы это делаете.
Ответ №1:
Вот решение для Swift 4
DispatchQueue.main.asyncAfter(deadline: .now() 3) {
// Excecute after 3 seconds
}
Ответ №2:
Если вы используете Alamofire
, ниже приведен код для определения тайм-аута
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 10 // seconds
configuration.timeoutIntervalForResource = 10
self.alamoFireManager = Alamofire.Manager(configuration: configuration)
также вам не нужно управлять этим с помощью таймера, поскольку таймер сработает ровно через 10 секунд, неважно, получит ли ваш API ответ или нет, просто управляйте им с помощью тайм-аута.
и вот как вы управляете таймаутом
self.alamofireManager!.request(.POST, "myURL", parameters:params)
.responseJSON { response in
switch response.result {
case .Success(let JSON):
//do json stuff
case .Failure(let error):
if error._code == NSURLErrorTimedOut {
//call your function here for timeout
}
}
}
Комментарии:
1. Спасибо, Раджат. Как мне вызвать функцию, когда истекает время ожидания? Предположим, я хочу вызвать некоторые
myFunc()
, когда время ожидания AlamoFire истечет.2. Отредактировал мой ответ, чтобы обработать тайм-аут, пожалуйста, проверьте.
3. Когда я использую just
Alamofire
, мой запрос работает нормально. Когда я используюAlamorefire.Manager
, он говоритNSErrorFailingURLStringKey
4. У меня
init()
решение не работает, потому что у меня нет никакихinit()
вызовов в моем коде. Есть ли способ передать конфигурациюAlamofire
самому себе? Вместо менеджера?5. попробуйте это в viedDidLoad
Ответ №3:
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time( DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), closure)
}
func loginFunc() {
delay(10.0){
//time is up, show network error
//return should break out of the function (not tested)
return
}
//authentication code