我有一个循环,我在其中向服务器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,但我真的不知道如何实现它,我正在寻找一个快速的解决方案。
Siesta不控制请求的排队方式或同时运行的请求数量。你有两个选择:
- 在应用程序端控制它,或者
- 在网络层对其进行控制
我会先研究选项2。它提供了较少的细粒度控制,但它以低廉的价格为您提供了更强大的选择,而且不太容易出错。如果您使用URLSession
作为网络层(这是Siesta的默认设置),请调查URLSessionConfiguration
的HTTPMaximumConnectionsPerHost
属性是否满足您的需要。(以下是将自定义配置传递给Siesta的一些示例。)
如果这对你不起作用,#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&3或闭合件2&3.这就是这种方法有效的原因。