2015-10-29 90 views
1

我有一个循环,我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

Siesta不控制请求如何排队或有多少请求同时运行。你有两个选择:

  1. 控制它在应用程序方面,还是
  2. 控制它在网络层。

我想先调查选项2。它可以减少细粒度的控制,但它以更便宜的方式为您提供更强大的选项,并且不易出错。如果您使用NSURLSession作为您的网络层(这是Siesta的默认设置),请调查NSURLSessionConfigurationHTTPMaximumConnectionsPerHost属性是否满足您的需求。 (在这里是通过自定义配置到午睡的some examples

如果不为你工作,#1一个简单的版本是使用完成处理程序链的要求:

func chainRequests(queue: [ThingsToRequest]) 
    guard let thing = queue.first else { return } 
    params = makeParamsFor(thing) 
    resource.request(.POST, json: params) 
    .success { 
     ... 
    }.failure { 
     ... 
    }.completion { _ in 
     chainRequests(queue[1 ..< queue.count]) 
    } 
} 

注您可以将多个重叠的处理程序附加到相同的请求,并按照您附加的顺序调用它们。另请注意,Siesta保证completion区块是总是调用,无论结果如何。这意味着每个请求都会导致呼叫关闭,或者关闭2 & 3.这就是为什么这种方法有效。