У меня есть два NSURLConnections. Второй зависит от содержимого первого, поэтому обработка данных, полученных от соединения, будет отличаться для этих двух соединений.
Я просто беру Objective-C и хотел бы знать, как правильно реализовать делегатов.
Сейчас использую:
NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];
Я не хочу использовать себя в качестве делегата, как мне определить два соединения с разными делегатами?
NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];
Как мне создать handle1 и handle2 как реализации? Или интерфейсы? Я действительно не понимаю, как вы это сделаете.
Любая помощь была бы потрясающей.
Спасибо, Брайан Джанфоркаро





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