Сохранить и повторно отправить запрос Alamofire - PullRequest
0 голосов
/ 28 октября 2018

Я использую 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)
}

}

1 Ответ

0 голосов
/ 28 октября 2018

Я почти не использовал AlamoFire, и это минимальное использование было пару лет назад.

Если посмотреть в коде AlamoFire, кажется, что функция request() возвращает объект DataRequest.Кроме того, похоже, что DataRequest является ссылочным типом, который предназначен для отслеживания определенного запроса к серверу и его ответов.

Похоже, что когда вы его создаете, вы используете его до тех пор, пока он не завершится или не завершится неудачей, а затем откажитесь от него.Похоже, они не предназначены для повторного использования для последующих запросов того же типа.

Подведем итог:

Вопрос:"Как повторно использовать объекты AlamoFire DataRequest."
Ответ: «Не делай этого».

...