Функция тайм-аута через 10 секунд Swift / iOS

#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