Mehrere NSURLConnection Delegierten in Objective-C
-
03-07-2019 - |
Frage
Ich habe zwei NSURLConnections. Die zweite hängt von dem Inhalt der ersten, so von der Verbindung, die die Datenverarbeitung eingehen, wird für die beiden Verbindungen unterschiedlich sein.
Ich bin nur Objective-C Aufnehmen und ich möchte wissen, was der richtige Weg, um die Delegierten zu implementieren ist.
Im Moment bin ich mit:
NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];
Ich will nicht selbst als Delegierten verwenden, wie kann ich definiere zwei Verbindungen mit verschiedenen Delegierten?
NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];
Wie würden erstelle ich Handle1 und handle2 als Implementierungen? Oder Schnittstellen? Ich verstehe wirklich nicht, wie Sie dies tun würden.
Jede Hilfe wäre genial.
Danke, Brian Gianforcaro
Lösung
In Ihrer Probe Alloc Sie ein DownloadDelegate Objekt ohne jemals init'ing es.
DownloadDelegate *dd = [DownloadDelegate alloc];
Das ist gefährlich. Statt dessen:
DownloadDelegate *dd = [[DownloadDelegate alloc] init];
Außerdem ist es nicht streng notwendig, um Ihre Delegierten Antwortmethoden in Ihrer @interface Erklärung zu erklären (wenn es nicht schadet, natürlich). Schließlich werden Sie sicherstellen möchten, dass Sie Verbindung implementieren: didFailWithError: und connectionDidFinishLoading. Ihr DownloadDelegate Objekt -release, sonst werden Sie Leck
Froh sind Sie zum Laufen!
Andere Tipps
Ben , während die Informationen hilfreich war es nicht in vollem Umfang die Frage beantworten, fragte ich.
ich endlich herausgefunden, wie meine eigenen Delegierten zu gründen, das war, was ich wirklich frage.
Ich setzte es in etwa so:
@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
Wir verwenden die Delegierten in etwa so:
DownloadDelegate *dd = [DownloadDelegate alloc];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];
Hoffnung, dass jemand in der gleichen Position hilft, und nochmals vielen Dank Ben für Ihre Hilfe.
Danke,
Brian Gianforcaro
Ich denke, der beste Weg, um mehrere Verbindungen in einer sauberen Art und Weise zu handhaben ist, einen einzigen Delegierten zu halten und zu identifizieren, nur jedes NSURLConnection mit einem Tag (es ist ein sehr, sehr einfach Subklassifizieren lesen Sie, und kopieren Sie von http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ )
Im Grunde jedes NSURLConnection mit einem Identifizierungs Tag init und dann können Sie diesen Tag in den Delegierten ziehen und mit dem Schalter-Fall damit umgeht nach was auch immer Logik, die Sie benötigen.
UPDATE
Ich habe die subclassed NSURLConnection in eine einfache Kategorie gedreht - ein wenig einfacher und sauberer
Delegierten werden als Standard NSObject abstammenden Objekte implementiert.
Sie können beide Verbindungen zum gleichen Delegierten zeigen.
Der Beauftragte sollte die NSURLConnectionDelegate Methoden implementieren Sie möchten fangen (wie -Anschluss: didReceiveData: und -connectionDidFinishLoading :). Diese Methoden werden von den Delegierten als angemessen aufgerufen.
Versuchen Sie, meine MultipleDownload Klasse unter http://github.com/leonho/iphone- libs / Baum / Master , die es mehrere NSURLConnection Objekte für Sie behandelt.
Da die Delegierten asynchron aufgerufen werden, könnten sie didfinishloading in zufälliger Reihenfolge nennen. Sie können dann eine Zustandsabfrage verwenden, um festzustellen, ob der „andere“ Download noch nicht fertig ist, bevor Sie fortfahren.
ich verwende 2 Delegierten:
zum Beispiel (dies ist Pseudo oc):
jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]
, wenn jeder Delegierte beendet ist, informiert die Delegierten den Anrufer, indem Sie die 2 done Methoden aufrufen.
jeder getan Methode empfängt die URL-Daten und speichert seinen Zustand zu einem Ivar. sie überprüfen, um zu sehen, dann, wenn der andere Ivar gesetzt, und die Verarbeitung fortzusetzen, wenn beide sie fertig sind.
if(self.jsonString && self.otherData){
continueProcessing
}
hoffe, das hilft.