Несколько делегатов NSURLConnection в Objective-C - PullRequest
15 голосов
/ 15 октября 2008

У меня есть два 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 как реализации? Или интерфейсы? Я не совсем понимаю, как вы это сделаете.

Любая помощь будет потрясающей.

Спасибо, Брайан Джанфоркаро

Ответы [ 6 ]

14 голосов
/ 16 октября 2008

Бен , хотя ваша информация была полезна. Она не полностью ответила на вопрос, который я задал.

Я наконец понял, как настроить своих собственных делегатов, о чем я действительно просил.

Я реализовал это так:

@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];

Надеюсь, что это поможет любому в том же положении, и еще раз спасибо Бен за вашу помощь.

Спасибо,

Брайан Джанфоркаро

10 голосов
/ 25 октября 2010

Я думаю, что лучший способ аккуратно обработать несколько соединений - это сохранить один делегат и просто идентифицировать каждое NSURLConnection с помощью тега (это ОЧЕНЬ простое подклассирование, о котором вы можете прочитать и скопировать из http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ )

В основном, чтобы инициировать каждое NSURLConnection с идентифицирующим тегом, а затем вы можете вытянуть этот тег в делегате и, используя Switch-Case, обработать его в соответствии с любой логикой, которая вам нужна.

UPDATE

Я превратил подключенное NSURLConnection в простую категорию - немного проще и чище

https://github.com/Shein/Categories

4 голосов
/ 16 октября 2008

В вашем примере вы выделяете объект DownloadDelegate, даже не инициируя его. DownloadDelegate *dd = [DownloadDelegate alloc];

Это опасно. Вместо этого:

DownloadDelegate *dd = [[DownloadDelegate alloc] init];

Кроме того, не строго необходимо объявлять методы ответа делегата в объявлении @interface (хотя это, конечно, не повредит). Наконец, вам нужно убедиться, что вы реализуете connection: didFailWithError: и connectionDidFinishLoading: для освобождения вашего объекта DownloadDelegate, в противном случае произойдет утечка.

Рад, что вы работаете!

3 голосов
/ 15 октября 2008

делегаты реализованы как стандартные объекты NSObject-descended.

Вы можете указать оба соединения одному и тому же делегату.

Делегат должен реализовать методы NSURLConnectionDelegate, которые вы хотите перехватить (такие как -connection: didReceiveData: и -connectionDidFinishLoading :). Эти методы будут вызваны делегатом соответствующим образом.

1 голос
/ 12 ноября 2008

Попробуйте мой класс MultipleDownload на http://github.com/leonho/iphone-libs/tree/master,, который обрабатывает несколько объектов NSURLConnection для вас.

0 голосов
/ 04 декабря 2009

, поскольку делегаты вызываются асинхронно, они могут вызывать didfinishloading в произвольном порядке. затем вы можете использовать проверку состояния, чтобы определить, завершена ли «другая» загрузка, прежде чем продолжить.

я использую 2 делегата:

например (это псевдо oc):

jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]

когда заканчивается каждый делегат, он сообщает вызывающему, вызывая 2 метода done.

каждый метод done получает данные url и сохраняет свое состояние в ivar. затем они проверяют, установлен ли другой ивар, и продолжают обработку, если они оба выполнены.

if(self.jsonString && self.otherData){
  continueProcessing
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...