Siesta处理多个请求

时间:2015-10-29 12:50:22

标签: swift siesta-swift

我有一个循环,我向服务器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,但我真的不知道如何实现这个,我正在寻找一个快速的解决方案。

1 个答案:

答案 0 :(得分:2)

Siesta不控制请求排队的方式或同时运行的请求数。你有两个选择:

  1. 在app端控制它,或
  2. 在网络层控制它。
  3. 我先调查选项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;这就是为什么这种方法有效的原因。