午睡处理多个请求

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 不控制请求的排队方式或同时请求的数量 运行。您有两个选择:

  1. 在应用端控制它,或者
  2. 在网络层控制。

我会先调查选项 2。它为您提供了较少的细粒度控制,但它以低廉的价格为您提供了更强大的选择,并且不易出错。如果您使用 URLSession 作为您的网络层(这是 Siesta 的默认设置),那么请调查 URLSessionConfigurationHTTPMaximumConnectionsPerHost 属性 是否满足您的需要。 (这里是 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。这就是这种方法有效的原因。