Шаблон, позволяющий Alamofire синхронно связывать зависимые запросы - PullRequest
0 голосов
/ 20 мая 2018

Я ищу шаблон для реализации в моем приложении, который позволил бы мне аккуратно получать от моего приложения информацию из нескольких http-запросов, где каждый запрос должен выполняться последовательно, один за другим, и передавать информацию из первогозапрос к следующему запросу.Я работал над многими решениями в этом вопросе , но многие ответы относятся к старым версиям Swift, есть конфликтующие решения, есть нерабочие решения, и ни один не обращается к получению данныхот одного запроса к следующему запросу .Кроме того, многие идеи не распространяются на более чем два запроса.

Причиной наличия нескольких запросов, которые не перекрываются, является то, что данные из предыдущих запросов передаются в следующий запрос.Или может быть так, что в зависимости от данных может иметь смысл пропустить некоторые http-запросы.

Я пробовал вложения запросов, которые работают на один уровень глубиной, но не работают на двух или более уровнях.Он также враждебен логике, где требуется пропуск некоторых запросов.

Alamofire.request(...).responseString { formResponse in
  Alamofire.request(...).responseString { submitResponse in
    Alamofire.request(...).responseString { getDataResponse in 
    // not only is this messy, it also did not proven to wait until all previous threads were done before working on the nested item.
    }
  }
}

Я также пытался настроить последовательную очередь с импортированным пакетом Alamofire-Synchronous :

let serialQ = DispatchQueue(label: "serialQ")
var info1 = ""
var info2 = ""
var info3 = ""

serialQ.async {
  Alamofire.request(...).responseString { formResponse in
    ....
    info1 = "good stuff"
  }
}

serialQ.async {
  Alamofire.request(...).responseString { submitResponse in 
    ....
    if info1 == "x" {...}
    info2 = "more good stuff"
  }

}

serialQ.async {
  Alamofire.request(...).responseString { getDataResponse in 
    ....
    if info2 == "x" {...}
    info3 = "even more good stuff"
  }
}

Приведенный выше код действует так, как будто синхронная функциональность пакета не делает ничего, чтобы помешать Alamofire создавать параллельные потоки.Другими словами, он просто проверяет все запросы, один за другим.Это может сработать, я не видел, где мой код на самом деле использовал код в пакете.

Я также пытался использовать идею, представленную в этом SO-ответе , но я не смог получитьэто работает.На самом деле я проработал все ответы на этот вопрос, и ни один из них не помог мне или некоторым «цепочечным» решениям, и не ответил на вопрос о том, как вы передаете данные из одного запроса в другой.

Я должен сделать это сложнее, чем должно быть!

Создание запроса http, ожидание результата и использование его в следующем запросе http, (и в следующем, иследующий) должен иметь элегантный шаблон программирования Swift / Alamofire.

Хороший ответ на этот вопрос позволит читателю создать код с использованием современных / текущих версий Swift и Alamofire, которые будут объединять несколько http-вызовов, когда ответ от предыдущего запроса используется вследующий запрос.Я использовал 3 зависимых запроса в моих примерах, но должен расширяться до «n», не увязая.

...