535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
1 | |
Http request26.11.2015, 13:08. Показов 1834. Ответов 25
Метки нет (Все метки)
Здравствуйте. Как получить ответ от сервера по url, без всяких асинхронных конструкций? Да, я знаю что нужно все подобные операции делать асинхронно, но мне нужно послать 10 запросов по очереди и если для каждого писать код в блоках получается очень длинная и не читаемая простыня. Поискал информацию - везде говорят, что можно только асинхронно, но как тогда поступают в ситуациях похожих на мою?
0
|
26.11.2015, 13:08 | |
Ответы с готовыми решениями:
25
Post autologin request Ошибки Synapse (HTTP/1.1 400 Bad Request / HTTP/1.1 413 Request Entity Too Large) Warning: file_get_contents(...) failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized Выполнение http.request http.get |
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
26.11.2015, 17:59 | 2 |
Да хоть:
послатьЗапрос1() послатьЗапрос2() ... послатьЗапрос10() Не очень понимаю в чем проблема.
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
26.11.2015, 18:03 [ТС] | 3 |
AncientPenguin, в том что для того, чтобы послать второй запрос мне нужен результат выполнения первого. А все ответы приходят в делегат. И чтобы мне послать по очереди 10 запросов нужно писать уже так:
запрос1(результат{ запрос2(результат{ запрос3... }) }) И в каждом случае есть несколько вариантов дальнейшего поведения. Т.е. куча проверок на все что можно сбор разных параметров с разных запросов и использование этих параметров в дальнейших запросах. Как это все красиво написать с асинхронными запросами просто не представляю.
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
26.11.2015, 19:21 | 4 |
запрос1(...)
{ ... запрос2(результат1) } запрос2(...) { ... запрос3(результат2) } Как вариант.
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
26.11.2015, 23:07 [ТС] | 5 |
AncientPenguin, ну тут я буду по 2-3 раза каждый запрос выполнять, а когда мне нужны еще и ответы от первых 5 запросов, для совершения восьмого - вообще мрак.
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
26.11.2015, 23:52 | 6 |
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
27.11.2015, 13:58 [ТС] | 7 |
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
27.11.2015, 14:46 [ТС] | 9 |
Можно по подробнее? Насколько я понял это что-то на подобии AsyncTask из андроид. Если так - с этим проблем нет, распраллелить я смогу как нужно. Вопрос лишь в том как мне последовательно в одном потоке выполнить несколько http запросов.
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
27.11.2015, 16:41 | 10 |
let delegate = {
(arg : type) -> returnType in ... } или var test: (Int, Int) -> Int = testFunc
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
27.11.2015, 16:54 [ТС] | 11 |
AncientPenguin, ну тут разница не большая получается. Все равно будет непонятная простыня фиг пойми чего. В андроиде у меня реализовано примерно так: есть класс, в котором есть все методы из серверного api, все они возвращают ответ в обертке (собственно сам ответ, код ошибки, если есть, и пару методов для проверок). Далее я запускаю отдельный поток, в нем по очереди вызываю методы из api, проверяю каждый на ошибки, беру нужные мне данные и т.п.. Итоговый результат пишу в бд из того же потока и сообщаю всем подписавшимся что все выполнено (уже в главный поток), и там уже кому что нужно берут прямо из бд. Но в случае с асинхронными запросами такое сделать не получится.
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
27.11.2015, 17:27 | 12 |
Spelcrawler, я не знаю как вам еще объяснить, скинете код покажу на примере.
О, придумал, вам надо сделать: Первый запрос должен сообщить второму, второй третьему и т.д., каждый запрос знает только про один следующий запрос.
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
27.11.2015, 17:34 [ТС] | 13 |
Ну это совсем издевательство. Пока написал deprecated код на obj-c - с ним выходят нормальные синхронные запросы. Видимо apple опять за всех решили, как нужно писать код и на swift'e такого не добиться.
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
27.11.2015, 18:11 | 14 |
Что это? Я вас пытался натолкнуть на мысль как по другому написать код, а не изменить функционал, но ваша фантазия работать не хочет, а виноват оказался эпл.
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
27.11.2015, 19:02 [ТС] | 15 |
AncientPenguin, не я все понимаю, но конструкция вида
результат1 = запрос1(); результат2 = запрос2(результат1); намного легче читается чем то что вы предлагаете. Человеку первый раз увидевшему такой код вообще не понятно будет кто и что слушает и где это все описано. Ну и если уж зашла речь про фантазию, то тут как раз ограничение ее - "нам нравится делать так, и вы все делайте так же". Не очень хорошая политика при разработке языка.
0
|
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
|
|
29.11.2015, 12:44 | 16 |
Сообщение было отмечено Spelcrawler как решение
Решение
есть такой паттерн как Promise или Future,
суть такая же как и с колбеками, только это грубо говоря колбеки, обернутые в объекты, над которыми можно проводить разные операции типа компановок и т.д https://github.com/mxcl/PromiseKit а есть еще интересней вещь, называется функциональное реактивное программирование (FRP) грубо говоря, это промисы представленные во времени и с кучей богатейшего функционала https://github.com/ReactiveCocoa/ReactiveCocoa https://github.com/ReactiveX/RxSwift Не хотел нагружать кучей всего, но, по моему мнению, это маст хев знания в современном мире разработки Добавлено через 2 минуты проблема в адище, который называют callback hell
1
|
5 / 5 / 4
Регистрация: 22.11.2015
Сообщений: 21
|
|
29.11.2015, 13:15 | 17 |
а почему sendSynchroniusRequest у NSURLConnection не катит?
0
|
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
|
|
03.12.2015, 10:25 [ТС] | 18 |
Что-то не вышло завести его на свифте под иос 9.1. Тот же самый код на obj-c работает, не знаю с чем связано, сильно не копал. Ну и насколько я понял через него не послать POST запрос.
0
|
5 / 5 / 4
Регистрация: 22.11.2015
Сообщений: 21
|
|
03.12.2015, 22:29 | 19 |
да, действительно этот метод задепрекейчен. Можно тогда действительно заюзать аналоги промисов, или например BFTask. Еще вариант правильно сказали обернуть в операцию, внутри операции заюзать какие нибудь dispatch группы или семафоры, чтобы сделать main метод синхронным. Потом эти операции нужно запускать на бекграундной очереди, им можно зависимости настраивать, в общем возможностей прилично.
1
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
||||||
04.12.2015, 00:22 | 20 | |||||
0
|
04.12.2015, 00:22 | |
04.12.2015, 00:22 | |
Помогаю со студенческими работами здесь
20
File_get_contents failed to open stream: HTTP request failed! HTTP/1.1 505 Http Request Http Request HTTP REQUEST <ERROR/> Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |