Несколько асинхронных запросов URL

Мое приложение для iPhone «зависало» или, скорее, «зависало», когда оно проходило за начальным экраном. Я думаю, это связано с тем, что регистрация удаленных push-уведомлений отправляется как синхронный запрос, и поэтому я хотел бы изменить его на асинхронный. Это проблема, так как я уже отправляю один асинхронный запрос на получение некоторых данных и сохранение их на телефон. Итак, я хотел бы отправить оба этих запроса асинхронно и заставить их делать две разные вещи в - (void)connectionDidFinishLoading:(NSURLConnection *)connection. Поэтому мне нужно знать, какое из двух соединений завершилось.

Есть какой-либо способ сделать это? Будет ли какой-то способ отличить URL-адрес готового соединения? На самом деле, я думал, что это будет так же просто, как установить tag и проверить это в - (void)connectionDidFinishLoading:(NSURLConnection *)connection, но это не представляется возможным.

Кто-нибудь знает, как я могу это сделать?


person simonbs    schedule 10.04.2011    source источник
comment
Это невероятно легко сделать с помощью ASIHttpRequest, которая является наиболее часто используемой сторонней библиотекой во всем iPhone. Ваша проблема решена.   -  person Fattie    schedule 10.04.2011


Ответы (3)


Как сказал Калле, лучше всего создать класс, который обрабатывает соединение, анализирует ответ и возвращает данные в красивой функции делегата.

Однако, если вы должны по какой-то причине сделать 2 NSURLConnection с одним и тем же делегатом, вам нужно сохранить ссылки на них обоих в классах ivars. Что-то вроде NSURLConnection *pushNotificationConnection; и NSURLConnection *someOtherConnection;

Тогда ваша функция didReceiveData должна выглядеть примерно так:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    if (connection == pushNotificationConnection)
    {
        // handle the push notification related data
    }
    else if (connection == someOtherConnection)
    {
        // handle the other connection
    }
}
person Zaky German    schedule 10.04.2011
comment
Это звучит умно в моих ушах. Я совершенно новичок в Objective-C. Как бы вы определили свои связи для начала, чтобы иметь возможность сравнивать их таким образом? - person simonbs; 10.04.2011
comment
@SimonBS в файле .h вашего viewController (или любого другого класса, который запускает соединение и действует как делегат, где вы анализируете данные из соединений и т. д.), определите *pushNotificationConnection; NSURLConnection *someOtherConnection; Затем при запуске соединений установите ссылки соответствующим образом. Например, pushNotificationConnection = [NSURLConnection connectionWithRequest:myPushNotificationsRequest]; сделать то же самое с другим соединением. Затем сравните соединение, возвращаемое функцией делегата, с такими, как в примере в моем ответе. - person Zaky German; 10.04.2011
comment
Конечно! Большое Вам спасибо. Это решило мою проблему. Мое приложение теперь не зависает при запуске. - person simonbs; 10.04.2011
comment
-1 не оставив комментарий? Я четко заявил, что это обычно должно быть сделано по-другому с точки зрения дизайна, но это то, что искал ОП... - person Zaky German; 26.04.2011
comment
Хех, да, я тоже получил минус без комментария. Я проголосовал за вас, чтобы выровнять ситуацию. пожал плечами - person Kalle; 26.04.2011

Чистый способ сделать это состоит в том, чтобы фактически иметь отдельный класс, обрабатывающий каждый запрос. Или, скорее, у вас есть класс, который должен выполнять запрос, получать данные, а затем отправлять их обратно (через делегирование) в основной класс, как только это будет сделано.

Таким образом, у вас будет два класса, например. PushNotificationRequestor и SomeLoader. Каждый будет создавать и поддерживать свои собственные отдельные запросы HTTP (или любого другого типа) и каждый будет иметь свои собственные отдельные методы connectionDidFinishLoading: и т. д.

person Kalle    schedule 10.04.2011

person    schedule
comment
Отформатируйте код с помощью кнопки {} на панели инструментов. Также, пожалуйста, объясните, как ваш код решает проблему. - person rgettman; 24.10.2013