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