Я собираюсь создать 2 запроса, используя NSURLConnection. Когда сервер отвечает и вызывает connectionDidFinishLoading, он проходит в соединении в качестве параметра, но как определить, какое соединение передано?
Создание нескольких NSURLConnections. Как определить, какой вызов Async
Ответ 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 может помочь.
С уважением, Прасанна.