【发布时间】:2017-06-20 07:36:50
【问题描述】:
我有一个使用 Alamofire 发出 URL 请求的 iOS 应用程序。当它们之间的时间很短时,我有时会发现请求以错误的顺序到达。据我了解,这与异步请求的性质有关。有没有办法保证请求的正确顺序?我一直在想你可以等待每个请求完成,因为你有一个完成处理程序,或者你可以在服务器端处理这个,每个请求都有一个时间戳,这样服务器就可以丢弃时间戳较低的请求。我不知道什么是最好的解决方案。
到目前为止我的代码:
Alamofire.request(
defaults.string(forKey: "APIurl")! + path,
method: httpMethod,
parameters: parameters,
encoding: JSONEncoding.default,
headers: headers).responseJSON
{ response in
// Check if the request was successful
var success = false
if (response.result.isSuccess) {
let statusCode = response.response!.statusCode
if (statusCode == 200) {
success = true
} else {
showAlert("COULD_NOT_COMPLETE_TASK_TITLE", message: "TRY_AGAIN_LATER")
}
}
}
我使用滑块来更改 0 到 100 之间的值。所以在我的例子中,请求的顺序是至关重要的。假设我将滑块从 50 更改为 60。对于异步请求,它有时会先执行 60,然后执行 50。这是一个问题,因为它是以这种方式发送到我的 API 并在数据库中保存最新值(在本例中为 50)甚至虽然我想要的值是 60。
【问题讨论】:
-
你不能保证异步请求的顺序,你必须做你的逻辑处理请求返回后做什么。
-
如果顺序很重要,那么要么按顺序分派请求,要么在所有请求完成后协调响应
-
保证他们完成顺序的唯一方法是在第一个请求完成之前不发出第二个请求(这是解决问题的一种非常愚蠢的方法)。 Wei Jay 是对的,您应该编写不依赖于响应进入顺序的代码。但是,如果没有更多上下文,我们无法帮助您解决该问题。但是,话又说回来,既然我们已经指出您需要以任何顺序来处理它们,您也可以弄清楚。
-
问题在于,如果它们以错误的顺序到达,API 将错误地相互渗透。我有一个滑块,您可以从 0 滑到 100。假设我将它从 50 滑到 60,请求以相反的顺序发送(60 到 50)。然后我会将“错误”数据发送到 API。有什么方法可以丢弃执行时间较长的请求?
-
您可以分配序列号或将请求中发送的客户端时间戳应用到服务器,然后让它进行排序。或者,如果您只关心最新的请求,请在发送后续请求之前取消先前的请求。或者,如果有持续不断的活动,也许您追求基于套接字的连接而不是 RESTful API。有很多方法可以解决这个问题。我建议你给我们一个你试图解决的现实世界的实际问题,而不是抽象地问我们这个问题。