Работа в сети iOS, когда приложение становится активным

В моем текущем приложении для iOS мне нужно выполнить несколько сетевых операций, когда приложение станет активным (я бы предпочел получить все сразу, чем запрашивать данные, когда пользователь нажимает на выделенную вкладку). Я использую UIViewController, который должен отображаться, когда приложение переходит на передний план и обрабатывает в нем все сетевые данные.
Это рекомендуемый способ сделать это?

Запросы, которые мне нужно отправить, выглядят примерно так:

request1
   if result1
      request2
         request3
   else if result2
      request4
         request3

Чтобы избежать спагетти-кода, можно ли использовать библиотеку, которая разрешает такие связанные запросы, как эти? Я использую ASIHttpRequest, и я не нашел хорошего способа выполнить это (даже с очередью).


person Luc    schedule 06.02.2012    source источник


Ответы (2)


В этом нет ничего плохого, если предположить, что ваш UIViewController является своего рода "загрузкой". Возможно, лучшим способом справиться с этим было бы создание NSObject подкласса, и он будет обрабатывать ваши сетевые операции, поэтому в ApplicationDidBecomeActive: вы можете просто запустить его, и при этом уверенно продолжать работу с вашим приложением.

person Amit Shah    schedule 06.02.2012
comment
вы имеете в виду одноэлементный объект, который будет обрабатывать логику работы сети (нужно ли их также вызывать из другого места в коде)? Но это хорошая идея. - person Luc; 07.02.2012
comment
Да, для этого можно использовать синглтон. - person Amit Shah; 07.02.2012

В AFNetworking 0.9 добавлена ​​возможность пакетной обработки запросов. AFHTTPCLient -enqueueBatchOfHTTPRequestOperationsWithRequests:progressBlock:completionBlock: ставит в очередь набор операций; когда каждая операция завершается, она запускает свой собственный completionBlock, как обычно, а также блок выполнения, который сообщает вам, сколько запросов было завершено. Затем, когда все будет завершено, выполняется последний блок завершения.

Итак, в вашем случае это может быть так просто:

[someClient enqueueBatchOfHTTPRequestOperationsWithRequests:[NSArray arrayWithObjects:request1, request2, request3, request4, nil] progressBlock:nil completionBlock:(controller logic here)];

person mattt    schedule 07.02.2012
comment
Не так давно я попробовал AFNetworking, но меня немного смутило, так как это не позволяло легко изменить интервал тайм-аута, я думаю, это была причина, по которой я придерживался ASIHttpRequest. Тогда я мог бы попробовать AFNetworking еще раз. - person Luc; 07.02.2012
comment
Изменить интервал тайм-аута так же просто, как установить свойство на NSMutableURLRequest. Кроме того, ваш интервал ожидания не обязательно будет соблюдено. ... то есть я надеюсь, что на этот раз AFNetworking вам понравится :) - person mattt; 08.02.2012