Siesta处理多个请求



我有一个循环,我在其中向服务器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属性是否满足您的需要。(以下是将自定义配置传递给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.这就是这种方法有效的原因。

相关内容

  • 没有找到相关文章

最新更新