Несколько делегатов NSURLConnection в Objective-C
У меня есть два NSURLConnections. Второй зависит от содержания первого, поэтому обработка данных, полученных от соединения, будет отличаться для двух соединений.
Я просто подбираю Objective-C, и я хотел бы знать, как правильно реализовать делегатов.
Сейчас я использую:
NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];
Я не хочу использовать self в качестве делегата, как определить два соединения с разными делегатами?
NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];
Как мне создать handle1 и handle2 как реализации? Или интерфейсы? Я действительно не понимаю, как вы это сделаете.
Любая помощь будет потрясающей.
Спасибо,
Брайан Джанфоркаро
Ответы
Ответ 1
В вашем примере вы добавляете объект DownloadDelegate без его инициализации.
DownloadDelegate *dd = [DownloadDelegate alloc];
Это опасно. Вместо этого:
DownloadDelegate *dd = [[DownloadDelegate alloc] init];
Кроме того, это не строго необходимо объявить ваши методы ответа делегата в объявлении @interface (хотя это, конечно, не повредит). Наконец, вы захотите убедиться, что вы реализуете соединение: didFailWithError: и connectionDidFinishLoading: для удаления вашего объекта DownloadDelegate, в противном случае вы пропустите.
Рад, что вы заработали!
Ответ 2
Ben, в то время как ваша информация была полезной. Он не полностью ответил на вопрос, который я задал.
Наконец-то я понял, как настроить своих собственных делегатов, чего я действительно спрашивал.
Я реализовал его так:
@interface DownloadDelegate : NSObject
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
@end
@implementation DownloadDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
}
@end
Мы используем делегат следующим образом:
DownloadDelegate *dd = [DownloadDelegate alloc];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];
Надеюсь, что это поможет кому-то в том же положении, и еще раз спасибо Ben за вашу помощь.
Спасибо,
Брайан Джанфоркаро
Ответ 3
Я думаю, что лучший способ обработать несколько соединений в чистом виде - это сохранить один делегат и просто идентифицировать каждый NSURLConnection с тегом (это очень ОЧЕНЬ простое подклассирование, о котором вы можете прочитать и скопировать из http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/)
В основном, чтобы инициализировать каждый NSURLConnection идентификационным тегом, а затем вы можете вытащить этот тег в делегате и использовать Switch-Case в соответствии с любой логикой, в которой вы нуждаетесь.
UPDATE
Я превратил подклассовое NSURLConnection в простую категорию - немного проще и чище
https://github.com/Shein/Categories
Ответ 4
делегаты реализованы как стандартные объекты, несущие NSObject.
Вы можете указать оба подключения к одному и тому же делегату.
Делегат должен реализовать методы NSURLConnectionDelegate, которые вы хотели бы уловить (например, -connection: didReceiveData: and -connectionDidFinishLoading:). Эти методы будут вызваны делегатом по мере необходимости.
Ответ 5
Попробуйте мой класс MultipleDownload в http://github.com/leonho/iphone-libs/tree/master, который обрабатывает для вас несколько объектов NSURLConnection.
Ответ 6
так как делегаты называются асинхронно, они могут вызвать didfinishloading в случайном порядке. вы можете использовать проверку состояния, чтобы определить, действительно ли "другая" загрузка завершена до продолжения.
я использую 2 делегата:
например (это псевдоо):
jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]
когда каждый делегат заканчивается, делегат информирует вызывающего абонента, вызывая 2 сделанных метода.
каждый обработанный метод получает данные url и сохраняет свое состояние в ivar. затем они проверяют, установлен ли другой ivar, и продолжайте обработку, если они оба выполнены.
if(self.jsonString && self.otherData){
continueProcessing
}
надеюсь, что это поможет.