Несколько делегатов 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:). Эти методы будут вызваны делегатом по мере необходимости.

Ответ 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
}

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