Ich habe eine Menge sich wiederholenden Codes in meiner Klasse, der wie folgt aussieht:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
Das Problem bei asynchronen Anforderungen besteht darin, dass bei verschiedenen Anfragen und einem Delegaten, der sie alle als eine Entität behandelt, eine Menge verzweigter und hässlicher Codes formuliert werden:
Welche Art von Daten erhalten wir zurück? Wenn es dies enthält, machen Sie das, sonst machen Sie andere. Ich denke, es wäre nützlich, diese asynchronen Anforderungen mit Tags versehen zu können, ähnlich wie Sie Ansichten mit IDs versehen können.
Ich war gespannt, welche Strategie für die Verwaltung einer Klasse, die mehrere asynchrone Anforderungen verarbeitet, am effizientesten ist.
quelle
[NSMapTable weakToStrongObjectsMapTable]
anstelle von a verwendenCFMutableDictionaryRef
und den Aufwand sparen können. Hat gut für mich funktioniert.Ich habe ein Projekt, in dem ich zwei verschiedene NSURLConnections habe und denselben Delegaten verwenden wollte. Ich habe zwei Eigenschaften in meiner Klasse erstellt, eine für jede Verbindung. Dann überprüfe ich in der Delegate-Methode, ob es sich um eine Verbindung handelt
Auf diese Weise kann ich bei Bedarf auch eine bestimmte Verbindung nach Namen abbrechen.
quelle
Die Unterklasse von NSURLConnection zum Speichern der Daten ist sauber, weniger Code als einige der anderen Antworten, flexibler und erfordert weniger Überlegungen zum Referenzmanagement.
Verwenden Sie es wie NSURLConnection und sammeln Sie die Daten in seiner Dateneigenschaft:
Das ist es.
Wenn Sie weiter gehen möchten, können Sie einen Block hinzufügen, der als Rückruf mit nur ein paar weiteren Codezeilen dient:
Stellen Sie es so ein:
und rufen Sie es auf, wenn das Laden wie folgt beendet ist:
Sie können den Block erweitern, um Parameter zu akzeptieren, oder einfach die DataURLConnection als Argument an die Methode übergeben, die sie wie gezeigt im Block no-args benötigt
quelle
Dies ist keine neue Antwort. Bitte lassen Sie mich Ihnen zeigen, wie ich es getan habe
Um verschiedene NSURLConnection innerhalb der Delegatmethoden derselben Klasse zu unterscheiden, verwende ich NSMutableDictionary, um die NSURLConnection mithilfe ihres
(NSString *)description
Schlüssels festzulegen und zu entfernen .Das Objekt, für
setObject:forKey
das ich mich entschieden habe, ist die eindeutige URL, die zum InitiierenNSURLRequest
derNSURLConnection
Verwendungen verwendet wird.Nach dem Einstellen wird NSURLConnection bei ausgewertet
quelle
Ein Ansatz, den ich gewählt habe, besteht darin, nicht für jede Verbindung dasselbe Objekt wie der Delegat zu verwenden. Stattdessen erstelle ich für jede Verbindung, die ausgelöst wird, eine neue Instanz meiner Parsing-Klasse und setze den Delegaten auf diese Instanz.
quelle
Probieren Sie meine benutzerdefinierte Klasse MultipleDownload aus , die all dies für Sie erledigt.
quelle
Normalerweise erstelle ich eine Reihe von Wörterbüchern. Jedes Wörterbuch enthält einige identifizierende Informationen, ein NSMutableData-Objekt zum Speichern der Antwort und die Verbindung selbst. Wenn eine Verbindungsdelegatmethode ausgelöst wird, schaue ich im Wörterbuch der Verbindung nach und behandle es entsprechend.
quelle
Eine Möglichkeit besteht darin, NSURLConnection selbst zu unterklassifizieren und ein -tag oder eine ähnliche Methode hinzuzufügen. Das Design von NSURLConnection ist absichtlich sehr nackt, daher ist dies durchaus akzeptabel.
Oder Sie können eine MyURLConnectionController-Klasse erstellen, die für das Erstellen und Sammeln der Daten einer Verbindung verantwortlich ist. Es müsste dann erst Ihr Hauptcontrollerobjekt informieren, wenn das Laden abgeschlossen ist.
quelle
In iOS5 und höher können Sie einfach die Klassenmethode verwenden
sendAsynchronousRequest:queue:completionHandler:
Verbindungen müssen nicht nachverfolgt werden, da die Antwort im Completion-Handler zurückgegeben wird.
quelle
Ich mag ASIHTTPRequest .
quelle
Wie in anderen Antworten erwähnt, sollten Sie connectionInfo irgendwo speichern und nach Verbindung suchen.
Der natürlichste Datentyp hierfür ist
NSMutableDictionary
, er kann jedoch nichtNSURLConnection
als Schlüssel akzeptiert werden, da Verbindungen nicht kopierbar sind.Eine weitere Option für die Verwendung
NSURLConnections
als SchlüsselNSMutableDictionary
ist die Verwendung vonNSValue valueWithNonretainedObject]
:quelle
Ich habe beschlossen, NSURLConnection in eine Unterklasse zu unterteilen und ein Tag, einen Delegaten und eine NSMutabaleData hinzuzufügen. Ich habe eine DataController-Klasse, die die gesamte Datenverwaltung einschließlich der Anforderungen übernimmt. Ich habe ein DataControllerDelegate-Protokoll erstellt, damit einzelne Ansichten / Objekte den DataController abhören können, um herauszufinden, wann ihre Anforderungen abgeschlossen wurden und bei Bedarf, wie viel heruntergeladen wurde oder welche Fehler aufgetreten sind. Die DataController-Klasse kann die NSURLConnection-Unterklasse verwenden, um eine neue Anforderung zu starten und den Delegaten zu speichern, der den DataController abhören möchte, um zu erfahren, wann die Anforderung abgeschlossen ist. Dies ist meine Arbeitslösung in XCode 4.5.2 und iOS 6.
Die Datei DataController.h, die das DataControllerDelegate-Protokoll deklariert. Der DataController ist auch ein Singleton:
Die wichtigsten Methoden in der Datei DataController.m:
Und um eine Anfrage zu starten:
[[NSURLConnectionWithDelegate alloc] initWithRequest:request delegate:self startImmediately:YES tag:@"Login" dataDelegate:delegate];
Die NSURLConnectionWithDelegate.h: @protocol DataControllerDelegate;
Und die NSURLConnectionWithDelegate.m:
quelle
Jede NSURLConnection hat ein Hash-Attribut. Sie können alle anhand dieses Attributs unterscheiden.
Zum Beispiel muss ich bestimmte Informationen vor und nach der Verbindung pflegen, damit mein RequestManager ein NSMutableDictionary hat, um dies zu tun.
Ein Beispiel:
Nach Anfrage:
quelle