【发布时间】: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