我有一个循环,我向服务器POST请求:
for (traineeId, points) in traineePointsDict {
// create a new point
let parameters: NSDictionary = [
"traineeId": "\(traineeId)",
"numPoints": points,
"exerciseId": "\(exerciseId)"
]
DataManager.sharedInstance.api.points.request(.POST, json: parameters).success { data in
if data.json["success"].int == 1 {
self.pointCreated()
} else {
self.pointFailToCreate()
}
}.failure { error in
self.pointFailToCreate()
}
}
问题在于,由于某种原因,最后一个请求失败了,我猜这是因为同时向服务器发布了太多请求。
有没有办法将这些请求链接起来,以便在执行下一个请求之前等待前一个请求完成?
我一直在看PromiseKit,但我真的不知道如何实现这个,我正在寻找一个快速的解决方案。
答案 0 :(得分:2)
Siesta不控制请求排队的方式或同时运行的请求数。你有两个选择:
我先调查选项2。它为您提供了较少的细粒度控制,但它为您提供了更便宜的更强大的选项,并且不容易出错。如果您使用URLSession
作为您的网络层(这是Siesta的默认设置),那么请调查HTTPMaximumConnectionsPerHost
URLSessionConfiguration
属性是否符合您的要求。 (以下是将自定义配置传递给Siesta的some examples。)
如果这对您不起作用,#1的简单版本就是使用完成处理程序来链接请求:
func chainRequests(_ queue: [ThingsToRequest])
guard let thing = queue.first else { return }
params = makeParamsFor(thing)
resource.request(.POST, json: params)
.onSuccess {
...
}.onFailure {
...
}.onCompletion { _ in
chainRequests(queue[1 ..< queue.count])
}
}
请注意,您可以将多个重叠处理程序附加到同一个请求,并按照您附加的顺序调用它们。另请注意,无论结果如何,Siesta都会保证completion
块始终被调用。这意味着每个请求都将导致对闭包1和1的调用。 3或闭合2&amp;这就是为什么这种方法有效的原因。