linkedin

Es gibt Momente im Leben eines jeden, in denen wir wissen, dass wir uns hinsetzen und etwas Unangenehmes tun müssen: eine Steuererklärung erstellen, ein OkCupid-Profil erstellen, ein OkCupid-Profil löschen, unsere Zehen rasieren usw. Sich selbst zu zwingen, eine neue API zu lernen, kann genauso unlustig erscheinen, aber oft muss es getan werden.

ASIHTTPRequest. Was soll ich dazu sagen? Ich habe kein Problem damit. Ich liebe es. Es ist einfach und ermöglicht es mir, schnell Code zu erstellen, der HTTP-Anfragen in nur wenigen Zeilen sendet. Hier ist ein Beispiel, bei dem ich einen Post und eine Datei sende:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:remoteUrl]; [request setPostValue:self.fileName.text forKey:@"name"]; [request setFile:filePath forKey:@"filename"]; [request setDelegate:self]; [request startAsynchronous];

Das gefällt mir: Ich setze den Post-Wert und seinen Schlüssel, ich setze die Datei und ihren Schlüssel, ich mache mich zum Delegierten und starte den Upload! Das Protokoll benachrichtigt mich, wenn es fertig ist, und ich kann weitermachen.

Traurigerweise wurde ASIHTTPRequest von einem Mann geschrieben, der es leid war, sich mit seinen schreienden Fans und Kritikern auseinanderzusetzen. Also beschloss er, das Projekt aufzugeben. Das ist der Segen/das Problem von Open-Source-Projekten: Sie sind frei/ungebunden. Der Code existiert zwar noch (und funktioniert auch noch), aber er wird ihn nicht mehr für zukünftige iOS-Versionen aktualisieren. Er sagte sogar in seinem Blog, dass es für uns alle an der Zeit sei, weiterzuziehen. Hier kommt AFNetworking.

Die guten Leute von Gowalla (ehemals Alamofire) haben eine HTTP-Anfrage-API entwickelt, die viele Leute zu nutzen beginnen. Aber ich meine Anfang. Sie ist einfach noch sehr neu. Ich habe sogar in den Code von jemandem hineingeschaut, der die Bibliothek von AFNetworking implementiert hat, um zu sehen, wie er sie verwendet; er tut es nicht. Sie haben sie eingebunden und dann aufgegeben, um ASIHTTPRequest weiter zu verwenden :)

Was die Dokumentation angeht, gibt es also immer noch nicht viel da draußen. Das bringt mich in die Lage, mir alles selbst beibringen zu müssen.

Erste Aufgabe: Installieren Sie die AFNetworking Dokumentation in Xcode

Eines der besten Tools in Xcode ist die Möglichkeit, die Dokumentation für ein Element mit zwei Klicks anzuzeigen. Zu meiner großen Überraschung stellte ich fest, dass man die Dokumentation auch für APIs von Drittanbietern installieren kann, wenn diese sie zur Verfügung stellen, was bei Gowalla der Fall ist. Allerdings muss man sich zuerst ein Tool namens appledoc besorgen und es installieren. Es wird als Xcode-Projekt geliefert UND enthält ein Shell-Skript für die Installation. Wenn Sie das verwenden, haben Sie also leichtes Spiel. Dann folgen Sie den Anweisungen von Gowalla, um die Dokumentation von GitHub zu installieren. Wenn Sie nun eine Dokumentation für eine AFNetworking-Klasse, -Methode usw. benötigen, finden Sie diese an der gleichen Stelle wie die Apple Foundation-Dokumentation!

Will-Code-Img_0.png

Zweite Aufgabe: Den Datei-Upload in Gang bringen

Nun, das war schwierig. Der Code, der notwendig ist, um das Gleiche wie oben zu tun, ist viel länger (ich sehe nicht, was das für ein Vorteil sein soll, ich mag es kurz und bündig)

aFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:remoteUrl]; NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@”POST” path:@”/photos” parameters:nil constructingBodyWithBlock: ^(id formData) { [formData appendPartWithFileData:photoImageData name:self.fileName.text fileName:[NSString stringWithFormat:@"%@.jpg", self.fileName.text] mimeType:@"image/jpeg"]; } ]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest]; [operation setUploadProgressBlock: ^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite); } ]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation]; [self takeADeepBreath];`

Ok. Dieser Code ist auf den ersten Blick verdammt schwer zu lesen. Lasst uns ihn aufschlüsseln.

aFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:remoteUrl];`

Damit wird eine neue Instanz des AFHTTPClient-Objekts angelegt, mit dem Sie in dieser API oft die Hauptarbeit leisten werden. Beachten Sie die praktische Methode zur Eingabe der URL bei der Initialisierung. Beachten Sie aber auch, dass dies die Basis-URL ist. Dies ermöglicht uns den einfachen Aufruf anderer relativer URLs, die wir benötigen, indem wir einfach das /[Verzeichnis] hinzufügen.

nSMutableURLRequest *afRequest = [httpClient

Das macht Sinn. Das ist es, was wir wirklich tun: URL-Anfragen stellen. Hier verwenden wir unsere Instanz von AFHTTPClient, um die Informationen zu erhalten, die wir in unsere Anfrage aufnehmen wollen.

multipartFormRequestWithMethod:@"POST" path:@"/photos"

Wir werden an das Webverzeichnis für Fotos posten, das eine von unserer Basis-URL ist. Wir könnten auch Put oder Delete verwenden.

parameters:nil

Das weiß ich immer noch nicht. Kann mir jemand eine E-Mail schicken und es mir sagen :)

constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {

“BLOCKS!!!!!?????” Ja. Blöcke. Es ist an der Zeit, ein Mann zu werden und einen Block zu benutzen. Und jetzt, wo ich das getan habe, habe ich keine Angst mehr. Es scheint mir, dass Blöcke wie kleine Funktionen innerhalb von Methoden funktionieren. Ich schätze, das spart uns ein wenig Platz, weil wir sie nicht deklarieren müssen usw. Aber sie sind sehr einschüchternd. Vor allem, wenn man sie nicht in den Einführungskursen zum iPhone gelernt hat.

Stellen Sie sich einen Block folgendermaßen vor: Er ist eine Funktion, die als Argument aufgerufen werden kann. Wenn ich das so sage, klingt das wirklich nützlich!

Nach dem Doppelpunkt setzen Sie eine Karotte (^), um den Beginn des Blocks zu definieren. Darauf folgt der Rückgabetyp (in diesem Fall eine Instanz des AFMultipartFormData-Objekts namens formData. Öffnen Sie eine geschweifte Klammer und starten Sie die Funktion!

[formData appendPartWithFileData:photoImageData name:self.fileName.text fileName:[NSString stringWithFormat:@"%@.jpg", self.fileName.text] mimeType:@"image/jpeg"];

Eine Nachricht und wir sind fertig mit dieser. Aber Moment mal. Wie kommt es, dass wir den Return in der Funktion verwenden? Nun, vielleicht ist ‘return’ das falsche Wort. Was ist es wirklich, ein Argument? Ein Argument, das von der aufrufenden Methode ausgefüllt wird? Oje. …

formData ist eine Instanz von AFMultipartFormData, die uns die Methode im Block (leichtfertig) zum Spielen überlässt. Und in diesem Fall nehmen wir diese Instanz und füllen sie mit den Daten, die wir in unserem HTTP-Body senden wollen:

die Datei (in diesem Fall ein Foto),

den Wert des Schlüssels “name” (den ich aus einem UITextField entnehme) und

des Schlüssels “fileName” (der hier nur der “Name” mit einer Erweiterung ist.

}

];

Schließen Sie nun diesen Block UND die ursprüngliche Nachricht!

So gesehen haben wir jetzt unsere HTTP-Post-Anfrage startklar. In ASIHTTP würden Sie einfach startSynchronous oder startAsynchronous anweisen, um es auf den Weg zu bringen. Hier müssen wir akzeptieren, dass gute Anwendungen von Grand Central Dispatch Gebrauch machen.

aFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest];`

AFHTTPRequestOperation erbt von AFURLConnectionOperation, die von NSOperation erbt. NSOperation ist die Klasse, die es uns ermöglicht, einzelne Aufgaben zu kapseln und sie mit mehr Kontrolle an die Prozessoren zu übergeben. Wir können Aufgaben nehmen und sie nach Threads in eine Warteschlange stellen, und der Compiler oder das Betriebssystem oder irgendetwas anderes weiß, auf welchen Prozessorkern sie zu setzen sind, so dass sie gleichzeitig laufen können!

Die Vorteile liegen auf der Hand: Übergeben Sie diese Aufgabe an einen Kern, damit andere Aufgaben nicht darauf warten müssen, dass Ihre kaputte URL eine Zeitüberschreitung erleidet oder Ihre große Datei über Edge hochgeladen wird. Bei richtiger Verwendung können Sie HTTP-bedingte Sperren für Ihre Anwendung vermeiden.

[operation setUploadProgressBlock: ^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite); } ];

BLOCK ALERT! Aber es ist wieder hilfreich. Dieser Block analysiert unseren Upload-Fortschritt für uns und gibt uns die Daten, mit denen wir nach Belieben verfahren können. Aufgeschlüsselt: Er gibt uns 3 Ints, mit denen wir spielen können:

bytesWritten, TotalBytesWritten und TotalBytesExpectedToWrite”

Willst du einen Fortschrittsbalken erstellen? Hier ist das Modell! Dieser Block läuft JEDESMAL, wenn ein Paket gesendet wird, und liefert uns nützliche Variablen, die ständig aktualisiert werden. (Ich fange wirklich an, dieses Zeug zu lieben!)

nSOperationQueue *queue = [[NSOperationQueue alloc] init];`

Es stellt sich heraus, dass man diese NSOperations nicht direkt an die Arbeit schicken kann. Man muss sie in eine NSOperationQueue packen. Ich wünschte, das wäre nicht nötig. Ich wünschte, man könnte ihnen einfach eine Startnachricht schicken und sie würden loslegen. Vielleicht eines Tages.

[queue addOperation:operation];`

Kompilieren und loslegen! Beobachten Sie, wie Ihre Anwendung ein Bild postet.

Wenn Sie nach einer Lösung suchen, um ASHttpRequest durch AFNetworking zu ersetzen, kontaktieren Sie uns noch heute!

Brauchen Sie weitere Hilfe?

Denken Sie, dass es an der Zeit wäre, zusätzliche Hilfe in Anspruch zu nehmen?

Door3.com