Я использую Alamofire и хочу отправить запрос на получение.Если это не удается, я хочу повторить попытку после некоторых других операций.
Я сохраняю запрос в переменной:
let myRequest = Alamofire.request("myurl", method: .get)
и в другой функции:
func retry(request:DataRequest) {
request.responseSwiftyJSON { response in
// ... code to handle the response ...
}
}
Таким образом, я могу многократно вызывать функцию повтора, передавая один и тот же объект myRequest.
Однако запрос отправляется корректно только в первый раз, затем я думаю, что он кэшируется (или каким-то образомобъект Alamofire понимает, что поле ответа объекта запроса уже является действительным), и запрос больше не отправляется на сервер.
Чтобы решить эту проблему, я попытался немного изменить функцию повторения в этомway:
func retry2(request:DataRequest) {
Alamofire.request(request.request!).responseSwiftyJSON { response in
// ... code to handle the response ...
}
}
Это должно инициализировать новый запрос Alamofire, используя только поле URLRequest сохраненного запроса, но теперь запрос вызывается дважды каждый раз!(Я проверяю это в своем бэкэнде, и я уверен, что это вызвано использованием этого подхода).
Есть ли способ повторно отправить исходный сохраненный запрос?Есть ли у Alamofire какой-нибудь способ инициализировать новый запрос из сохраненного?
Решение
В итоге я сделал что-то вроде @JonShier, и @DuncanC предложил мне:
struct APIRequest {
let url: URLConvertible
let method: HTTPMethod
let parameters: Parameters?
let encoding: ParameterEncoding
let headers: HTTPHeaders?
init(_ url:URLConvertible, method:HTTPMethod = .get, parameters:Parameters? = nil, encoding:ParameterEncoding = URLEncoding.default, headers:HTTPHeaders? = nil) {
self.url = url
self.method = method
self.parameters = parameters
self.encoding = encoding
self.headers = headers
}
func make() -> DataRequest {
return Alamofire.request(url, method: method, parameters: parameters, encoding: encoding, headers: headers)
}
}