Несколько делегатов NSURLConnection в Objective-C
-
03-07-2019 - |
Вопрос
У меня есть два 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 в качестве реализаций?Или интерфейсы?Я действительно не понимаю, как бы ты это сделал.
Любая помощь была бы потрясающей.
Спасибо, Брайан Джанфоркаро
Решение
В вашем примере вы выделяете объект DownloadDelegate, даже не инициализируя его.
DownloadDelegate *dd = [DownloadDelegate alloc];
Это опасно.Вместо этого:
DownloadDelegate *dd = [[DownloadDelegate alloc] init];
Кроме того, это не строго необходимо объявить ваши методы делегирования ответов в объявлении @interface (хотя, конечно, это не повредит).Наконец, вам нужно убедиться, что вы реализуете connection:didFailWithError:и завершающая загрузка connectiondid:чтобы освободить ваш объект DownloadDelegate, в противном случае произойдет утечка.
Рад, что ты на ногах и работаешь!
Другие советы
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 за твою помощь.
Спасибо,
Брайан Джанфоркаро
Я думаю, что лучший способ обрабатывать несколько подключений чистым способом - это сохранить один делегат и просто идентифицировать каждое NSURLConnection с тегом (это очень-очень простой подкласс, о котором вы можете прочитать и скопировать http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ )
В основном для инициализации каждого NSURLConnection с идентифицирующим тегом, а затем вы можете извлечь этот тег в делегате и с помощью Switch-Case обработать его в соответствии с любой необходимой вам логикой.
Обновить
Я превратил подкласс NSURLConnection в простую категорию - немного проще и чище
делегаты реализованы как стандартные объекты, происходящие от NSObject.
Вы можете указать оба соединения на один и тот же делегат.
Делегат должен реализовать методы NSURLConnectionDelegate, которые вы хотели бы перехватить (например, -connection:didReceiveData:и -connectionDidFinishLoading:).Эти методы будут вызываться делегатом соответствующим образом.
Попробуйте мой класс MultipleDownload по адресу http://github.com/leonho/iphone-libs/tree/master, который обрабатывает несколько объектов NSURLConnection для вас.
поскольку делегаты вызываются асинхронно, они могут вызывать didfinishloading в случайном порядке.затем вы можете использовать проверку состояния, чтобы определить, завершена ли "другая" загрузка, прежде чем продолжить.
я использую 2 делегата:
например (это псевдо oc):
jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]
когда каждый делегат завершает работу, делегат сообщает вызывающему объекту, вызывая 2 метода done.
каждый выполненный метод получает данные URL и сохраняет их состояние в ivar.затем они проверяют, установлен ли другой ivar, и продолжают обработку, если они оба выполнены.
if(self.jsonString && self.otherData){
continueProcessing
}
надеюсь, это поможет.