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.
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.
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.
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.
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];
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.
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.
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];
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.
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.