Ios 保存并重新发送Alamofire请求

Ios 保存并重新发送Alamofire请求,ios,swift,xcode,httprequest,alamofire,Ios,Swift,Xcode,Httprequest,Alamofire,我正在使用Alamofire,我想发送一个get请求。如果失败,我想在其他一些操作之后重试 我将请求保存在变量中: let myRequest = Alamofire.request("myurl", method: .get) 在另一个功能中: func retry(request:DataRequest) { request.responseSwiftyJSON { response in // ... code to handle the response ...

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

我将请求保存在变量中:

let myRequest = Alamofire.request("myurl", method: .get)
在另一个功能中:

func retry(request:DataRequest) {
   request.responseSwiftyJSON { response in
      // ... code to handle the response ...
   }
}
通过这种方式,我可以多次调用retry函数,传递相同的对象myRequest

但是,只有在第一次正确发送请求时,我认为它会被缓存(或者在某种程度上,Alamofire对象意识到请求对象的响应字段已经有效),并且请求不会再次发送到服务器

为了解决这个问题,我尝试通过以下方式稍微更改重试函数:

func retry2(request:DataRequest) {
   Alamofire.request(request.request!).responseSwiftyJSON { response in
      // ... code to handle the response ...
   }
}
这应该只使用保存的请求的URLRequest字段初始化一个新的Alamofire请求,但是现在请求每次调用两次!(我在后端检查它,我确信这是使用这种方法造成的)

有没有办法重新发送原始保存的请求?Alamofire是否有办法从保存的请求初始化新请求

解决方案

最后我做了一些类似于@JonShier和@Duncan建议我的事情:

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)
}

}

我很少使用AlamoFire,而这种最低限度的使用是在几年前

环顾AlamoFire代码,似乎
request()
函数返回一个
DataRequest
对象。此外,它看起来像一个
DataRequest
是一个引用类型,用于跟踪到服务器的特定请求及其响应

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

总结如下:

问题:“如何重用AlamoFire DataRequest对象。”

回答:“不要那样做。”

我相信生成的请求对象可以被视为一个操作。每次要重试时,都需要重新生成请求。我认为,对这一请求举行摄政会议,在很大程度上是打算取消的。如果您保留对它的唯一引用,它还允许您在重新发送之前检查一个引用是否已经存在,并取消它request@AntonTheDev你知道有没有一种方法可以从一个已完成的请求开始创建一个新的请求?尝试使用func-triggerRequest方法(对于URL:String){}。然后在故障块中再次调用:),但一定要以某种方式跟踪您的尝试3次,因为您可能会产生失控效果。此外,您还可以触发特定于超时、连接丢失等的逻辑,以不基于错误代码重试。因此,我必须保存所有请求参数(如url、方法、标题、参数等),并每次重新创建一个新的DataRequest对象,对吗?@keyblade95您需要保存馈送到Alamofire的任何表示。这可能是单独的变量,一个包含所有相关信息的单一类型,或者是您提供给Alamofire的
URLRequest
。我建议使用符合Alamofire的
URLRequestConvertible
的类型,并存储所需的所有参数。这样你就可以保存它,并在需要时将它发送给Alamofire。某种结构似乎是一种自然选择。将URL、方法、标题等放入结构中。我现在正在工作,工作机器上没有AlamoFire,但正如Jon Shier在评论中所建议的那样,符合URLrequestConverable协议的对象听起来是个不错的选择。@JonShier我最终按照你的建议做了me@DuncanC我最终按照你的建议做了