2015-10-29 86 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.這就是爲什麼這種方法有效。