Swift - Тайм-аут рекурсивной функции, которая выполняет сетевой вызов? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть функция, которая выполняет сетевой вызов и проверяет ответ, и снова выполняет другой сетевой вызов, если ответ не соответствует определенным критериям.(Слово от WordsAPI, которое не имеет значения для «результатов»)

Он продолжает вызывать, пока не получит действительный результат.

Как мне установить его так, чтобы после определенного количествавремя, он перестает звонить и вылетает с ошибкой.Допустим, я хочу, чтобы пределом для вызовов было 10 секунд, и сетевой вызов занимает 3 секунды каждый раз, четвертый вызов должен завершиться, но 5-й вызов должен завершиться с ошибкой.

Я думал о настройкеТаймер запускается при первом вызове функции, и функция может указывать, активен ли таймер перед продолжением, но мне интересно, не является ли это ресурсным / потоковым способом сделать это.

Вот чтомой сетевой вызов выглядит следующим образом.

func fetchRandomWord(completion: @escaping (String?, Error?) -> ()) {

    var request = URLRequest(url: URL(string: randomWordUrlString)!)
    request.httpMethod = "GET"
    request.setValue(API_KEY, forHTTPHeaderField: "X-RapidAPI-Key")
    request.timeoutInterval = 10

    Alamofire.request(request).validate().responseJSON { (response) in
        guard response.result.isSuccess, let value = response.result.value else { completion(nil, response.error); return }

        let json = JSON(value)

        if let word = json["word"].string {
            //Check word has results associated
            self.fetchData(for: word, completion: { (json, error) in
                if let json = json {
                    if json["results"].array != nil {
                        completion(word, nil)
                    } else {
                        completion(nil, FetchError.MissingResults)
                    }
                } else {
                    completion(nil, FetchError.MissingResults)
                }
            })
        } else {
            completion(nil, FetchError.MissingResults)
        }
    }
        .resume()
}

И эта функция вызывает ее и продолжает вызывать, если возвращается ошибка ->

    func fetchRandomWord() {
    currentWord.accept("")
    isFetchingRandomWord.accept(true)

    manager.fetchRandomWord { (word, error) in
        if let word = word {
            self.currentWord.accept(word)
            self.isFetchingRandomWord.accept(false)
        } else {
            //handle error fetching word
            print(error?.localizedDescription)
            self.fetchRandomWord()
        }
    }
}
...