Вопрос

У меня есть два 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 в простую категорию - немного проще и чище

https://github.com/Shein/Categories

делегаты реализованы как стандартные объекты, происходящие от 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
}

надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top