Создание нескольких NSURLConnections. Как определить, какой асинхронный вызов - PullRequest
10 голосов
/ 12 сентября 2009

Я собираюсь создать 2 запроса, используя NSURLConnection. Когда сервер отвечает и вызывает connectionDidFinishLoading, он передает соединение как параметр, но как определить, в какое соединение передано?

Ответы [ 5 ]

12 голосов
/ 13 сентября 2009

Сохраните оба объекта NSURLConnection как переменные-члены любого объекта делегата, который вы передали в connectionWithRequest: Delegate :. Затем вы можете просто сравнить каждый из них с NSURLConnection, переданным connectionDidFinishLoading:, и ответить соответствующим образом:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == firstConnection) {
        // do something
    }
    else if (connection == secondConnection) {
        // do something else
    }
}

Еще один немного более объектно-ориентированный вариант - создать два разных объекта делегата, каждый из которых знает, как работать с каждым типом соединения. Затем просто передайте соответствующий делегат при создании каждого соединения. Таким образом, вам не нужно проверять, какое у вас соединение, потому что каждый делегат будет получать только connectionDidFinishLoading: для своего собственного соединения.

2 голосов
/ 13 сентября 2009

Я предпочитаю разных делегатов для каждого соединения тоже. Хотя это немного накладные расходы. К счастью, вы можете упростить вещи с помощью блоков. Это новая функция, которой пока нет в стандартном SDK, но есть сторонний фреймворк под названием PLBlocks , который вы уже можете использовать. Вот статья о том, как их использовать, а также пример NSURLConnection.

Это код клиента, создающий HTTP-запрос с обратным вызовом блока:

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
[NSURLConnection sendAsynchronousRequest:req onCompletionDo: ^(NSData *data, NSURLResponse *res, NSError *err) {
    NSLog(@"data: %ld bytes. res: %@, error: %@", (long)[data length], res, err);
    [cell.activity stopAnimating];
}];
1 голос
/ 13 сентября 2009

Я также использовал для создания пользовательской оболочки около NSURLConnection, но теперь я переключился на ASIHTTPRequest . Это фантастическая библиотека, предоставляющая гораздо больше гибкости и возможностей, чем NSURLConnection. Посмотрите и попробуйте, это действительно того стоит.

1 голос
/ 13 сентября 2009

Что я делаю в своих проектах, так это создаю класс-обертку для соединения. Таким образом, вы можете сохранить новый экземпляр для каждого нужного вам соединения и поддерживать эти классы в другом классе менеджера.

Что-то вроде [AsynchronousConnection initWithURL: делегат: селектор:]

Тогда вы можете быть уверены, что правильный вызов вызывается, когда соединение NSURLC выполнено / не выполнено.

0 голосов
/ 03 июня 2012

Пожалуйста, не ссылайтесь https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

Перейдите в файл NSURLConnection.h, и вы найдете следующее.

При создании NSURLConnection выполняет глубокую копию NSURLRequest. Эта копия доступна через -originalRequest метод. Поскольку соединение выполняет загрузку, этот запрос может измениться в результате канонизации протокола или вследствие перенаправляет. -currentRequest может использоваться для получения этого значения.

В конечном итоге [подключение currentRequest] .URL absoluteURL может помочь.

С уважением, Прасанна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...