2015-10-29 2 views
1

У меня есть цикл, где я POST запросы на сервер:Siesta обработки нескольких запросов

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), изучите, действительно ли свойство HTTPMaximumConnectionsPerHostNSURLSessionConfiguration делает то, что вам нужно. (. Вот some examples прохождения пользовательской конфигурации в Siesta)

Если это не работает для вас, простой вариант # 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 блок всегда называется независимо от результата. Это означает, что каждый запрос приведет к звонкам на замыкания 1 & 3 или замыкания 2 & 3. Вот почему этот подход работает.

Смежные вопросы