Arbeiten mit NSURLSession AFNetworking 2.0

In den vorangegangenen Raten dieser Serie haben wir uns die NSURLSession API wurde in iOS 7 und OS X Mavericks eingeführt. Die Vernetzung unter iOS und OS X ist dank der neuen Funktionen viel einfacher und flexibler geworden NSURLSession API. Bedeutet dies, dass Sie AFNetworking für Ihre Netzwerkanforderungen einstellen sollten? Und was ist mit AFNetworking 2.0, das vor einigen Monaten eingeführt wurde? In dieser letzten Folge werde ich Ihnen etwas über AFNetworking 2.0 und dessen Vergleich mit dem NSURLSession API.


Einführung

Wie Mattt Thompson auf NSHipster feststellt, ist AFNetworking die De-facto-Netzwerkbibliothek für Cocoa-Anwendungen. Zum Zeitpunkt des Schreibens hat die Bibliothek 10.000 Sterne auf GitHub übertroffen und wurde fast 3.000 Mal gegabelt.

Wenn Sie sich mit AFNetworking noch nicht auskennen und mehr über seine Geschichte und Funktionen erfahren möchten, empfehle ich Ihnen, den Beitrag von Mattt über AFNetworking 2.0 auf NSHipster zu lesen. In diesem Artikel möchte ich mich auf zwei Aspekte konzentrieren: Was ist neu in AFNetworking 2.0 und wie wird es mit dem verglichen? NSURLSession API. Die Frage, die Sie sich stellen sollten, lautet "Soll ich AFNetworking noch mit verwenden?" NSURLSession in meiner Toolbox? "Dies ist die Frage, die ich in diesem Artikel beantworten möchte.


Bedarf

Bevor wir uns das Angebot von AFNetworking 2.0 genauer ansehen, ist es wichtig, die neuen Anforderungen der Bibliothek zu kennen. Es sollte keine Überraschung sein, dass die Anforderungen von AFNetworking 2.0 strenger sind als die von AFNetworking 1.x. Wie aus der Versionsnummer hervorgeht, enthält AFNetworking bahnbrechende Änderungen, die das Ergebnis seiner neuen Architektur sind. Dies bedeutet auch, dass die Migration eines Projekts von AFNetworking 1.x auf 2.0 mit Vorsicht erfolgen sollte. Das Migrationshandbuch ist der ideale Ausgangspunkt, wenn Sie ein Projekt nach AFNetworking 2.0 migrieren möchten.

AFNetworking unterstützt iOS 4.3 und 5 nicht mehr. Die Mindestimplementierungsziele für iOS und OS X sind iOS 6 und OS X 10.8. Für AFNetworking 2.0 ist außerdem Xcode 5 erforderlich. Wenn Sie noch Xcode 4 verwenden, ist dies möglicherweise ein guter Zeitpunkt, um auf Xcode 5 umzusteigen.


Solide Basis

AFURLConnectionOperation

Wie viele von Ihnen wahrscheinlich wissen, baut AFNetworking auf NSURLConnection und NSOperation, was sich als kraftvolle und elegante Kombination erwiesen hat. Das Ergebnis dieser Kombination ist AFURLConnectionOperation, ein NSOperation Unterklasse, die ein verwaltet NSURLConnection Instanz und implementiert die NSURLConnectionDelegate Protokoll. Obwohl dieses robuste Fundament in AFNetworking 2.0 unverändert bleibt, wird es durch die NSURLSession API, auf die ich später noch näher eingehen werde.

Aufteilung der Verantwortlichkeiten

In AFNetworking 1.x die AFHTTPRequestOperation Die Klasse war für die Serialisierung und Validierung von Anfragen und Antworten verantwortlich. Dies ist in AFNetworking 2.0 nicht mehr der Fall. Das AFHTTPRequestOperation Klasse und ihre Unterklassen sind nicht mehr direkt verantwortlich für die Serialisierung und Validierung von Anforderungen und Antworten. Diese Verantwortung wurde in den verschoben AFURLAnfrageSerialisierung und AFURLResponseSerialisierung Protokolle. Jedes Protokoll deklariert eine einzelne Delegatmethode, um die Serialisierung und Validierung von Anforderungen und Antworten zu verarbeiten.

Um Ihnen das Leben zu erleichtern, wird AFNetworking 2.0 jedoch mit ausgeliefert AFHTTPRequestSerializer und AFHTTPResponseSerializer sowie eine Reihe von Unterklassen für gängige Inhaltstypen wie JSON und XML. Um zu sehen, wie dies in der Praxis funktioniert, werfen wir einen Blick auf ein Beispiel, in dem ich die Forecast-API abfrage. Das sieht nicht ganz anders aus, als Sie mit AFNetworking 1.x eine Anfrage gestellt haben. Der Hauptunterschied ist, dass Sie die verwenden AFHTTPRequestOperation öfter Klasse. Das AFJSONRequestOperation und AFXMLRequestOperation Klassen sind in AFNetworking 2.0 nicht mehr vorhanden.

 NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267 ,-122.423", Schlüssel]]; // Request-Operation initialisieren AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation Allocation] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Anforderungsvorgang konfigurieren [requestOperation setResponseSerializer: [AFJSONResponseSerializer-Serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (Operation AFHTTPRequestOperation *, ID responseObject) // Antwortobjekt verarbeiten Fehler: ^ (Operation AFHTTPRequestOperation *, Fehler NSError *) // Fehler bei der Verarbeitung]; // Anforderungsvorgang starten [requestOperation start];

Das AFJSONResponseSerializer Klasse erbt von AFHTTPResponseSerializer und sollte für JSON-Antworten verwendet werden. Wenn Sie XML-Antworten verarbeiten müssen, dann AFXMLNResponseSerializer wird dir helfen Für andere Inhaltstypen müssen Sie eine Unterklasse erstellen AFHTTPResponseSerializer.

AFHTTPRequestOperationManager

Eine weitere wichtige Änderung in AFNetworking 2.0 ist die Entfernung von AFHTTPClient Klasse, die für das Gespräch mit Webdiensten zuständig war. Die Verantwortlichkeiten von AFHTTPClient wurden in eine Reihe von Klassen und Protokollen aufgeteilt. Um mit einem Webdienst zu sprechen, verwenden Sie jetzt AFHTTPRequestOperationManager und AFHTTPSessionManager. So wie AFHTTPRequestOperation, AFHTTPRequestOperationManager und AFHTTPSessionManager Delegieren der Serialisierung von Anforderungen und Antworten an separate Objekte. Beide AFHTTPRequestOperationManager und AFHTTPSessionManager haben eine requestSerializer und responseSerializer Eigenschaft für diesen Zweck. Gehen wir das obige Beispiel noch einmal durch, um zu sehen, wie dies in der Praxis funktioniert.

 NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/", Schlüssel]]; // Initialisieren des Anforderungsoperations-Managers AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager-Zuordnung] initWithBaseURL: baseURL]; // Request Operation Manager konfigurieren [manager setResponseSerializer: [AFJSONResponseSerializer Serializer]]; // Send Request [Manager GET: @ "37.8267, -122.423" Parameter: Kein Erfolg: ^ (AFHTTPRequestOperation * -Operation, ID-ResponseObject) // Antwortobjekt verarbeiten Fehler: ^ (AFHTTPRequestOperation * -Operation, NSError * -Fehler) / / Handle-Fehler];

Wie wäre es mit NSURLSession?

AFURLSessionManager

Die Schlüsselfrage bei der Diskussion von AFNetworking 2.0 im Lichte der NSURLSession API ist, ob wir AFNetworking noch benötigen. AFNetworking fügt eine Reihe von Convenience-Klassen und -Methoden hinzu NSURLSession API und dies ist nur dank der Trennung der Verantwortlichkeiten möglich, die ich zuvor erörtert habe. Die bedeutendste Verbesserung, die AFNetworking zusätzlich bietet NSURLSession API sind die AFURLSessionManager und AFHTTPSessionManager Klassen.

Das AFURLSessionManager hilft Ihnen bei der Verwaltung einer NSURLSession Objekt. Obwohl ich das liebe NSURLSession API, ich muss Mattt zustimmen, dass seine API unvollständig ist. Das AFURLSessionManager Klasse fügt eine Reihe von Komfortmethoden hinzu, die die NSURLSession API noch besser. Serialisierung und Validierung sind beispielsweise mit AFNetworking viel einfacher und intuitiver. Genau wie das AFHTTPRequestOperationManager, Instanzen von AFURLSessionManager haben eine requestSerializer und responseSerializer Diese Eigenschaft macht die Serialisierung von Anforderungen und Antworten nahtlos und intuitiv.

 NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267 ,-122.423", Schlüssel]]; // Sessionkonfiguration initialisieren NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Session Manager initialisieren AFURLSessionManager * manager = [[Zuweisung von AFURLSessionManager] initWithSessionConfiguration: sessionConfiguration]; // Configure Manager [Manager setResponseSerializer: [AFJSONResponseSerializer Serializer]]; // Send Request NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[manager dataTaskWithRequest: request completionHandler: ^ (NSURLResponse * -Antwort, ID responseObject, NSError * error) // Process Response Object] Lebenslauf];

Ich hoffe, Sie können den Nutzen der Verwendung von AFNetworking in Kombination mit dem sehen NSURLSession API. Es macht das Arbeiten mit dem NSURLSession Die API ist viel intuitiver, insbesondere wenn Sie bereits daran gewöhnt sind, wie AFNetworking 2.0 Serialisierung und Validierung von der eigentlichen Task- oder Anforderungsoperation trennt.

AFHTTPSessionManager

AFNetworking 2.0 enthält auch eine Unterklasse von AFURLSessionManager, AFHTTPSessionManager, was die Interaktion mit Web-Services zu einem Kinderspiel macht. Das AFHTTPSessionManager Klasse enthält eine Reihe von Komfortmethoden, wie z GET: Parameter: Erfolg: Fehler: und POST: Parameter: constructingBodyWithBlock: Erfolg: Fehler: das macht den Migrationsprozess aus AFHTTPClient zu AFHTTPSessionManager einfach. Ähnliche Methoden gibt es auch im AFHTTPRequestOperationManager Klasse, über die ich früher gesprochen habe.


Erreichbarkeit

Die Erreichbarkeit wird vom verwaltet AFURLRequestOperationManager und AFURLSessionManager Klassen. Wenn Instanzen dieser Klassen einen gültigen Wert haben baseURL, Anschließend wird ein Erreichbarkeitsmanager automatisch instanziiert und eingerichtet. Natürlich ist es auch möglich, explizit eine Instanz von zu erstellen AFNetworkReachabilityManager Klasse.


Zuckerglasur auf dem Kuchen

AFNetworking 2.0 verfügt über eine Reihe weiterer Funktionen, z. B. integrierte Unterstützung für SSL-Pinning und verschiedene Kategorien für UIKit-Klassen. Sehen Sie sich dieses Beispiel an, in dem ich die Kategorie von AFNetworking einsetzt UIProgressView So aktualisieren Sie eine Fortschrittsansicht, während Sie ein Remote-Image herunterladen.

 // Anfrage initialisieren NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Initialize Session Manager self.sessionManager = [[Zuweisung von AFURLSessionManager] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Initialize Download Task NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: Fortschrittsanforderung: nil destination: ^ NSURL * (NSURL * targetPath, NSURLResponse * -Antwort) // Handle Success completionHandler: ^ (NSURLResponse * Antwort, NSURL * filePath , NSError * error) // Fehler behandeln]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask animated: YES]; [downloadTask-Lebenslauf];

Urteil

Wenn Ihr Projekt nicht auf Netzwerke angewiesen ist, benötigen Sie nicht die gesamte Leistung und den Komfort, den AFNetworking bietet. Ich denke, es ist wichtig, dass jeder iOS- oder OS X-Entwickler vertraut ist NSURLSession und NSURLConnection, weil sie Schlüsselkomponenten der Plattform sind.

Obwohl die NSURLSession Die API ist großartig und einfach zu verwenden. Die vom Foundation Framework bereitgestellten Netzwerk-APIs sind nicht perfekt. Wie Mattt feststellt, auch das NSURLSession API hat einige bemerkenswerte Lücken. AFNetworking versucht diese Lücken elegant zu schließen. Die Kombination der NSURLSession API und AFNetworking ist eine im Himmel gemachte Verbindung. Es ist wirklich eine Freude zu benutzen.

Ich mag das wirklich NSURLSession API und ich hoffe, ich habe Sie in dieser Serie von ihrer Leistungsfähigkeit überzeugt. Dies bedeutet jedoch nicht, dass AFNetworking veraltet ist. Meiner Meinung nach ist AFNetworking der perfekte Begleiter der NSURLSession API. AFNetworking ist ausgereift und es ist tatsächlich die beste und robusteste Netzwerkbibliothek, die es gibt. Durch die modulare Architektur müssen Sie nicht jede Klasse oder Kategorie einschließen, die es bietet. Sie können aus den darin enthaltenen Komponenten auswählen und auswählen. AFNetworking unterstützt CocoaPods-Subspezifikationen, die diesen Prozess trivial machen.


Fazit

Ich könnte mit der zweiten Hauptversion von AFNetworking nicht zufriedener sein. Die Modularität der Bibliothek und die Trennung der Verantwortlichkeiten lassen meiner Meinung nach glänzen. Es ergänzt das NSURLSession API so gut, dass Sie nicht einmal bemerken, dass Sie AFNetworking verwenden. Mattt Thompson und die mehr als 130 Mitarbeiter von AFNetworking haben hervorragende Arbeit geleistet. Es ist gut, ein Cocoa-Entwickler zu sein.