2008-10-15 2 views
15

У меня есть два NSURLConnections. Второй зависит от содержания первого, поэтому обработка данных, полученных от соединения, будет отличаться для двух соединений.Несколько делегатов NSURLConnection в Objective-C

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

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

Спасибо, Brian Gianforcaro

ответ

4

В вашем примере вы Alloc объект DownloadDelegate никогда не init'ing его.

 
    DownloadDelegate *dd = [DownloadDelegate alloc]; 

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

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

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

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

3

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

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

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

14

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

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

Спасибо,

Brian Gianforcaro

+2

Великий ответ. Именно то, что я искал. Спасибо, что нашли время, чтобы ответить на собственный вопрос – Pillblast 2011-12-07 14:20:24

0

Поскольку делегаты называются асинхронно, они могут вызывать 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 
} 

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

10

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

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

UPDATE

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

https://github.com/Shein/Categories

Смежные вопросы