Создание нескольких NSURLConnections. Как определить, какой вызов Async

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

Ответ 1

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

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

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

Ответ 2

Я предпочитаю разные делегаты для каждого соединения. Хотя это немного накладные расходы. К счастью, вы можете упростить вещи, используя блоки. Это новая функция, которая еще не существует в стандартном 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];
}];

Ответ 3

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

Что-то вроде [AsynchronousConnection initWithURL: delegate: selector:]

Затем вы можете убедиться, что правильная вещь вызывается, когда NSURLConnection завершен/не выполнен.

Ответ 4

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

Ответ 5

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

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

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

В конечном счете [connection currentRequest].URL absoluteURL может помочь.

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