保存并重新发送 Alamofire 请求

Posted

技术标签:

【中文标题】保存并重新发送 Alamofire 请求【英文标题】:Save and resend Alamofire request 【发布时间】:2018-10-28 14:29:19 【问题描述】:

我正在使用 Alamofire,我想发送一个获取请求。如果失败,我想在其他一些操作后重试。

我将请求保存在一个变量中:

let myRequest = Alamofire.request("myurl", method: .get)

在另一个函数中:

func retry(request:DataRequest) 
   request.responseSwiftyJSON  response in
      // ... code to handle the response ...
   

这样,我可以多次调用重试函数,传递同一个对象myRequest。

但是,请求只是第一次正确发送,然后我认为它被缓存了(或者以某种方式Alamofire对象意识到请求对象的响应字段已经有效)并且请求没有再次发送到服务器。

为了解决这个问题,我尝试用这种方式稍微改变一下重试功能:

func retry2(request:DataRequest) 
   Alamofire.request(request.request!).responseSwiftyJSON  response in
      // ... code to handle the response ...
   

这应该只使用已保存请求的 URLRequest 字段来初始化一个新的 Alamofire 请求,但现在该请求每次都会被调用两次! (我在后端检查它,我确定这是使用这种方法引起的)。

有没有办法重新发送原始保存的请求? 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)



【问题讨论】:

相信生成的请求对象可以认为是一个操作。每次要重试时,您都需要重新生成请求。持有摄政权的请求,我相信,大部分是为了取消。如果您保留对它的唯一引用,它还允许您在重新发送相同请求之前检查一个是否已经存在并取消它 @AntonTheDev 你知道是否有一种方法可以从已完成的请求开始创建新请求? 尝试使方法 func triggerRequest(for URL:String) 。然后在失败块中再次调用它:) 但一定要以某种方式跟踪你尝试了 3 次,因为你可能会产生失控的效果。您还可以触发特定于超时、连接丢失等的逻辑,以根据错误代码不重试 【参考方案1】:

我用 AlamoFire 的次数不多,而且这种最少的使用是几年前的事了。

查看 AlamoFire 代码,request() 函数似乎返回了一个 DataRequest 对象。此外,看起来DataRequest 是一种引用类型,旨在跟踪对服务器的特定请求及其响应。

它看起来就像你创建了一个,你使用它直到它完成或失败,然后丢弃它。它们似乎不打算重复用于相同类型的后续请求。

总结一下:

问题:“我如何重用 AlamoFire DataRequest 对象。” 答案:“不要那样做。”

【讨论】:

所以,我必须保存所有请求参数(如 url、方法、标头、参数……)并每次重新创建一个新的 DataRequest 对象,对吧? @keyblade95 您需要保存您提供给 Alamofire 的任何表示。这可能是单独的变量,包含所有相关信息的单一类型,或者您提供给 Alamofire 的 URLRequest。我推荐一种符合 Alamofire 的URLRequestConvertible 并存储所有所需参数的类型。这样您就可以将其持久化并在需要时将其发送到 Alamofire。 某种结构似乎是一种自然的选择。将 URL、方法、标头等放入结构中。我现在在工作,我的工作机器上没有 AlamoFire,但正如 Jon Shier 在他的评论中所建议的那样,符合 URLRequestConvertible 协议的对象听起来是个不错的选择。 @JonShier 我最终按照你的建议去做了 @DuncanC 我最终按照你的建议去做了

以上是关于保存并重新发送 Alamofire 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 post 方法中发送标头

在 swift 3 中下载文件时,alamo fire 中的进度视图不会更新

将 alamofire json 响应转换为变量

将数据保存在特定用户 ID iOS - Alamofire, Json

如何使用 Alamofire 重试请求?

Alamofire 2 不允许 SSL 连接 Instagram API