Delegati NSURLConnection multipli in Objective-C
-
03-07-2019 - |
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
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
??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.