1

我有一个循环向服务器发布请求:

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,但我真的不知道如何实现它,我正在寻找一个快速的解决方案。

4

1 回答 1

2

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

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

我会先调查选项 2。它为您提供了较少的细粒度控制,但它以便宜的价格为您提供了更强大的选择,并且不易出错。如果您将URLSession其用作网络层(这是 Siesta 的默认设置),请调查 的HTTPMaximumConnectionsPerHost属性是否满足URLSessionConfiguration您的需要。(以下是将自定义配置传递给 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。这就是这种方法有效的原因。

于 2015-10-29T17:15:35.353 回答