【问题标题】:Save and resend Alamofire request保存并重新发送 Alamofire 请求
【发布时间】: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 次,因为你可能会产生失控的效果。您还可以触发特定于超时、连接丢失等的逻辑,以根据错误代码不重试

标签: ios swift xcode httprequest alamofire


【解决方案1】:

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

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

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

总结一下:

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

【讨论】:

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