Я ищу шаблон для реализации в моем приложении, который позволил бы мне аккуратно получать от моего приложения информацию из нескольких 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», не увязая.