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

War es hilfreich?

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

https://github.com/Shein/Categories

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top