Swift-超时执行网络调用的递归函数?

时间:2019-03-29 09:15:11

标签: swift networking timeout alamofire

我有一个函数,可以执行网络调用并验证响应,如果响应不符合特定条件,则可以再次执行另一个网络调用。 (来自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()
        }
    }
}

0 个答案:

没有答案