午睡处理多个请求
Siesta handling multiple requests
我有一个循环,我 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
属性 是否满足您的需要。 (这里是 some examples 将自定义配置传递给 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。这就是这种方法有效的原因。
我有一个循环,我 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
属性 是否满足您的需要。 (这里是 some examples 将自定义配置传递给 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。这就是这种方法有效的原因。