2009-09-12 2 views

Antwort

12

Speichern Sie beide NSURLConnection-Objekte als Mitgliedsvariablen eines beliebigen delegierten Objekts, das Sie an connectionWithRequest übergeben haben: delegate :. Dann können Sie einfach jeden der Vergleich mit dem NSURLConnection zu connectionDidFinishLoading weitergegeben :, und entsprechend reagieren:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    if (connection == firstConnection) { 
     // do something 
    } 
    else if (connection == secondConnection) { 
     // do something else 
    } 
} 

Ein weiteres etwas mehr objektorientierte Option wäre, zwei verschiedene Delegierte Objekte zu erstellen, von denen jeder weiß, wie man umgehen mit jeder Art von Verbindung. Übergeben Sie dann den entsprechenden Delegaten, wenn Sie jede Verbindung erstellen. Auf diese Weise müssen Sie nicht überprüfen, welche Verbindung Sie haben, da jeder Delegat nur connectionDidFinishLoading erhält: für seine eigene Verbindung.

+3

Dies ist keine sehr skalierbare Lösung – coneybeare

+0

Nicht so skalierbar, aber nette Lösung, löste mein Problem. Vielen Dank. – Krishna

+0

@cduhn ist es möglich, NSURLConnection und geben Sie eine ID-Eigenschaft als NSString zum Beispiel. Auf diese Weise müssen Sie bei einer unbegrenzten Anzahl von Objekten, die jeweils eine Verbindung benötigen (z. B. eine Liste von Freundschaftsanfragen akzeptieren), die ID Ihrer CustomNSURLconcection auf den Wert einstellen, der Ihr Objekt eindeutig identifiziert zB BenutzerID? Auf diese Weise müssen Sie keine Instanz von Hunderten von NSURL-Verbindungen haben. Ich kann das im Moment nicht testen, deshalb frage ich hier – pnizzle

1

Was ich in meinen Projekten mache, ist eine Wrapper-Klasse für die Verbindung zu erstellen. Auf diese Weise können Sie für jede benötigte Verbindung eine neue Instanz beibehalten und diese Klassen in einer anderen Verwaltungsklasse verwalten.

So etwas wie [AsynchronousConnection initWithURL: Delegierter: Selektor:]

Dann können Sie das Richtige sein, sicherzustellen, wird aufgerufen, wenn die NSURLConnection erfolgt/nicht bestanden.

2

Ich bevorzuge auch verschiedene Delegierte für jede Verbindung. Obwohl es ein bisschen Overhead ist. Glücklicherweise können Sie Dinge vereinfachen, indem Sie Blöcke verwenden. Es ist ein neues Feature, das im SDK noch nicht existiert, aber es gibt 3rd-party framework called PLBlocks, die Sie bereits verwenden können. Here is an article auf, wie man sie benutzt, es enthält auch Beispiel für NSURLConnection.

Dies ist der Client-Code mit Block Rückruf macht HTTP-Anforderung:

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
[NSURLConnection sendAsynchronousRequest:req onCompletionDo: ^(NSData *data, NSURLResponse *res, NSError *err) { 
    NSLog(@"data: %ld bytes. res: %@, error: %@", (long)[data length], res, err); 
    [cell.activity stopAnimating]; 
}]; 
1

habe ich einen benutzerdefinierten Wrapper um NSURLConnection auch zu schaffen, aber ich habe eingeschaltet jetzt ASIHTTPRequest über. Dies ist eine fantastische Bibliothek, die viel mehr Flexibilität und Funktionen als NSURLConnection bietet. Schau es dir an und probier es, es ist es wirklich wert.

+0

Ich benutze dies auch, aber habe einen Wrapper um diese – coneybeare

+0

Ich verwendete ASIHTTPRequest als naja, aber leider ab September 2011 wird es nicht mehr von seinem Autor unterstützt: http://allseeing-i.com/%5Brequest_release%5D –

+1

@DanJ: Eine sehr beliebte Alternative in diesen Tagen scheint zu sein [AFNetworking] (https://github.com/AFNetworking/AFNetworking/). –

0

Bitte beziehen sich nicht https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

GO auf die NSURLConnection.h Datei und Sie werden die folgenden finden.

Wenn erstellt, führt eine NSURLConnection eine tiefe Kopie des NSURLRequest. Diese Kopie ist über die Methode -originalRequest verfügbar. Wenn die Verbindung die Last ausführt, kann diese Anforderung als Ergebnis der Protokoll-Kanonisierung oder aufgrund von folgenden Weiterleitungen ändern: . -currentRequest kann verwendet werden, um diesen Wert abzurufen.

Letztendlich könnte [connection currentRequest] .URL absoluteURL helfen.

Grüße, PRASANNA.

+0

Prasanna was bedeutet das? – Ranjit

Verwandte Themen