Domanda

Ho due connessioni NSURLC. Il secondo dipende dal contenuto del primo, quindi la gestione dei dati ricevuti dalla connessione sarà diversa per le due connessioni.

Sto solo raccogliendo Objective-C e vorrei sapere qual è il modo corretto di implementare i delegati.

In questo momento sto usando:

NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];

Non voglio usare self come delegato, come posso definire due connessioni con delegati diversi?

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];

Come creo handle1 e handle2 come implementazioni? O interfacce? Non capisco come faresti.

Qualsiasi aiuto sarebbe fantastico.

Grazie, Brian Gianforcaro

È stato utile?

Soluzione

Nel tuo esempio, allochi un oggetto DownloadDelegate senza mai avviarlo.

    DownloadDelegate *dd = [DownloadDelegate alloc];

Questo è pericoloso. Invece:

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

Inoltre, non è rigorosamente necessario dichiarare i metodi di risposta dei delegati nella dichiarazione @interface (anche se ovviamente non farà male). Infine, ti consigliamo di implementare la connessione: didFailWithError: e connectionDidFinishLoading: per rilasciare il tuo oggetto DownloadDelegate, altrimenti perderai.

Sono contento che tu sia attivo e funzionante!

Altri suggerimenti

Ben , mentre le tue informazioni sono state utili Non ha risposto completamente alla domanda che ho posto.

Alla fine ho capito come impostare i miei delegati, cosa che stavo davvero chiedendo.

L'ho implementato in questo modo:

@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

Usiamo il delegato in questo modo:

DownloadDelegate *dd = [DownloadDelegate alloc];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];

Spero che aiuti tutti nella stessa posizione, e grazie ancora Ben per il tuo aiuto.

Grazie,

Brian Gianforcaro

Penso che il modo migliore per gestire più connessioni in modo pulito sia mantenere un singolo delegato e semplicemente identificare ogni NSURLConnection con un tag (è una sottoclasse MOLTO semplice che puoi leggere e copiare da http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ )

Fondamentalmente per iniziare ogni NSURLConnection con un tag identificativo e quindi puoi estrarre quel tag nel delegato e usando Switch-Case gestirlo secondo la logica di cui hai bisogno.

Aggiorna

Ho trasformato la sottoclasse NSURLConnection in una semplice Categoria - un po 'più semplice e pulita

https://github.com/Shein/Categories

I delegati

??sono implementati come oggetti standard discesi da NSObject.

È possibile puntare entrambe le connessioni allo stesso delegato.

Il delegato dovrebbe implementare i metodi NSURLConnectionDelegate che vorresti catturare (come -connection: didReceiveData: e -connectionDidFinishLoading :). Questi metodi verranno chiamati dal delegato come appropriato.

Prova la mia lezione MultipleDownload su http://github.com/leonho/iphone- libs / tree / master , che gestisce più oggetti NSURLConnection per te.

poiché i delegati sono chiamati in modo asincrono, potrebbero chiamare didfinishloading in ordine casuale. puoi quindi utilizzare un controllo di stato per determinare se il " altro " il download è ancora fatto prima di continuare.

Uso 2 delegati:

per esempio (questo è pseudo oc):

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

al termine di ciascun delegato, il delegato informa il chiamante chiamando i 2 metodi completati.

ogni metodo fatto riceve i dati dell'URL e salva il suo stato su un ivar. quindi controllano se è impostato l'altro ivar e continuano l'elaborazione se entrambi sono stati eseguiti.

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

spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top