Arbeta med NSURLSession AFNetworking 2.0

I de tidigare delarna av denna serie har vi tittat på NSURLSession API införs i iOS 7 och OS X Mavericks. Nätverk på iOS och OS X har blivit mycket enklare och flexiblare tack vare NSURLSession API. Betyder detta att du borde sluta använda AFNetworking för dina nätverksbehov? Och vad sägs om AFNetworking 2.0, som introducerades för några månader sedan? I den här sista delen kommer jag att berätta om AFNetworking 2.0 och hur det jämförs med NSURLSession API.


Introduktion

Som Mattt Thompson påpekar på NSHipster har AFNetworking blivit de facto nätverksbiblioteket för kakaoapplikationer. I skrivande stund har biblioteket överträffat 10 000 stjärnor på GitHub och gaffeltes nära 3000 gånger.

Om du är ny på AFNetworking och vill läsa mer om dess historia och funktioner, föreslår jag att du läser Matts post om AFNetworking 2.0 på NSHipster. I den här artikeln vill jag fokusera på två aspekter, vad är nytt i AFNetworking 2.0 och hur jämför det det med NSURLSession API. Frågan du borde fråga dig är "Ska jag fortfarande använda AFNetworking med NSURLSession i min verktygslåda? "Det är den fråga jag planerar att svara i den här artikeln.


Krav

Innan vi tar en närmare titt på vad AFNetworking 2.0 har att erbjuda, är det viktigt att veta om bibliotekets nya krav. Det ska inte vara en överraskning att kraven i AFNetworking 2.0 är strängare än AFNetworking 1.x. Som versionsnummer indikerar AFNetworking brytsändringar, vilket är resultatet av sin nya arkitektur. Det innebär också att migrering av ett projekt från AFNetworking 1.x till 2.0 ska göras med försiktighet. Migreringsguiden är den perfekta platsen att börja om du planerar migrering av ett projekt till AFNetworking 2.0.

AFNetworking stöder inte längre iOS 4.3 och 5. Minimala implementeringsmål för iOS och OS X är iOS 6 respektive OS X 10.8. AFNetworking 2.0 kräver också Xcode 5. Om du fortfarande använder Xcode 4 kan det här vara en bra tid att göra övergången till Xcode 5.


Solid Foundation

AFURLConnectionOperation

Som många av er säkert vet, är AFNetworking byggt på toppen av NSURLConnection och NSOperation, vilket har visat sig vara en kraftfull och elegant kombination. Resultatet av denna kombination är AFURLConnectionOperation, en NSOperation underklass som hanterar en NSURLConnection instans och implementerar NSURLConnectionDelegate protokoll. Trots att denna robusta grund förblir oförändrad i AFNetworking 2.0 kompletteras den av NSURLSession API, som jag kommer att beskriva mer i detalj senare.

Separering av ansvar

I AFNetworking 1.x, den AFHTTPRequestOperation klassen var ansvarig för begäran och svar serialisering och validering. Detta är inte längre sant i AFNetworking 2.0. De AFHTTPRequestOperation klass och dess underklasser är inte längre direkt ansvarig för serialisering och validering av förfrågningar och svar. Detta ansvar har flyttats till AFURLRequestSerialization och AFURLResponseSerialization protokoll. Varje protokoll förklarar en enskild delegatmetod för att hantera förfrågnings- och responsserialisering och validering respektive.

För att göra ditt liv enklare, levererar AFNetworking 2.0 dock med AFHTTPRequestSerializer och AFHTTPResponseSerializer samt ett antal underklasser för vanliga innehållstyper, till exempel JSON och XML. För att se hur detta fungerar i praktiken, låt oss ta en titt på ett exempel där jag frågar prognos API. Det ser inte så annorlunda ut än hur du gjorde en förfrågan med AFNetworking 1.x. Huvudskillnaden är att du ska använda AFHTTPRequestOperation klass oftare. De AFJSONRequestOperation och AFXMLRequestOperation klasser finns inte längre i AFNetworking 2.0.

 NSString * nyckel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,122.423", nyckel]]; // Initialisera förfrågan Operation AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Konfigurera förfrågan Operation [requestOperation setResponseSerializer: [AFJSONResponseSerializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (AFHTTPRequestOperation * operation, id responseObject) // Process Response Object fel: ^ (AFHTTPRequestOperation * operation, NSError * -fel) // Hantera fel]; // Startförfrågan Operation [requestOperation start];

De AFJSONResponseSerializer klass ärver från AFHTTPResponseSerializer och bör användas för JSON-svar. Om du behöver bearbeta XML-svar, då AFXMLNResponseSerializer hjälper dig ut. För andra innehållstyper behöver du underklass AFHTTPResponseSerializer.

AFHTTPRequestOperationManager

En annan stor förändring i AFNetworking 2.0 är borttagningen av AFHTTPClient klass, som var ansvarig för att prata med webbtjänster. Ansvaret för AFHTTPClient har delats upp i ett antal klasser och protokoll. För att prata med en webbtjänst, använder du nu AFHTTPRequestOperationManager och AFHTTPSessionManager. Precis som AFHTTPRequestOperation, AFHTTPRequestOperationManager och AFHTTPSessionManager delegera serialisering av förfrågningar och svar på separata objekt. Både AFHTTPRequestOperationManager och AFHTTPSessionManager ha en requestSerializer och responseSerializer egendom för detta ändamål. Låt oss återgå till ovanstående exempel för att se hur det fungerar i praktiken.

 NSString * nyckel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/", nyckel]]; // Initiera Request Operations Manager AFHTTPRequestOperationManager * Manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: baseURL]; // Konfigurera förfrågan Operations Manager [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Skicka förfrågan [manager GET: @ "37.8267, -122.423" parametrar: ingen framgång: ^ (AFHTTPRequestOperation * -operation, id responseObject) // Process Response Object fel: ^ (AFHTTPRequestOperation * operation, NSError * -fel) / / Hantera fel];

Vad sägs om NSURLSession?

AFURLSessionManager

Nyckelfrågan när man diskuterar AFNetworking 2.0 i ljuset av NSURLSession API är om vi fortfarande behöver AFNetworking. AFNetworking lägger till ett antal bekvämlighetsklasser och metoder till NSURLSession API och det här är bara möjligt tack vare ansvarsfördelningen som jag diskuterade tidigare. Den viktigaste förbättringen som AFNetworking ger på toppen av NSURLSession API är AFURLSessionManager och AFHTTPSessionManager klasser.

De AFURLSessionManager hjälper dig att hantera en NSURLSession objekt. Även om jag älskar NSURLSession API, jag måste hålla med Mattt att dess API är ofullständigt. De AFURLSessionManager klassen lägger till ett antal bekvämlighetsmetoder som gör NSURLSession API ännu bättre. Serialisering och validering är till exempel mycket enklare och intuitiv med AFNetworking. Precis som AFHTTPRequestOperationManager, instanser av AFURLSessionManager ha en requestSerializer och responseSerializer egendom som gör serialisering av förfrågningar och svar sömlösa och intuitiva.

 NSString * nyckel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,122.423", nyckel]]; // Initiera Session Configuration NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Initiera Session Manager AFURLSessionManager * Manager = [[Tilldela AFURLSessionManager] initWithSessionConfiguration: sessionConfiguration]; // Configure Manager [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Skicka förfrågan NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[manager dataTaskWithRequest: request completionHandler: ^ (NSURLResponse * svar, id responseObject, NSError * fel) // Process Response Object] återuppta];

Jag hoppas att du kan se nytta av att använda AFNetworking i kombination med NSURLSession API. Det gör jobbet med NSURLSession API mycket mer intuitivt, särskilt om du redan är van vid det sätt som AFNetworking 2.0 separerar serialisering och validering från den faktiska uppgiften eller förfrågan.

AFHTTPSessionManager

AFNetworking 2.0 innehåller också en underklass av AFURLSessionManager, AFHTTPSessionManager, vilket gör interaktion med webbtjänster en bris. De AFHTTPSessionManager klassen innehåller ett antal bekvämligheter metoder, till exempel GET: parametrar: framgång: misslyckande: och POST: parametrar: constructingBodyWithBlock: framgång: misslyckande: som gör migreringsprocessen från AFHTTPClient till AFHTTPSessionManager lätt. Liknande metoder finns också i AFHTTPRequestOperationManager klass, som jag diskuterade tidigare.


Nåbarhet

Reachability hanteras av AFURLRequestOperationManager och AFURLSessionManager klasser. När instanser av dessa klasser har en giltighet baseURL, då en reachability manager automatiskt instansieras och ställs in. Det är självklart också möjligt att uttryckligen skapa en instans av AFNetworkReachabilityManager klass.


Icing On The Cake

AFNetworking 2.0 har ett antal andra funktioner, som inbyggt stöd för SSL-pinning och olika kategorier på UIKit-klasser. Ta en titt på det här exemplet där jag utnyttjar AFNetworkings kategori på UIProgressView för att uppdatera en framdriftsvy medan du hämtar en fjärrbild.

 // Initiera begäran NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Initiera Session Manager self.sessionManager = [[Tilldela AFURLSessionManager] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Initiera nedladdningssats NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: begäran framsteg: nil destination: ^ NSURL * (NSURL * targetPath, NSURLResponse * svar) // Hantera framgång completionHandler: ^ (NSURLResponse * svar, NSURL * filePath , NSError * -fel) // Hantera misslyckande]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask animated: YES]; [downloadTask resume];

Dom

Om ditt projekt inte är beroende av nätverk, behöver du inte all kraft och bekvämlighet som AFNetworking har att erbjuda. Faktum är att det är viktigt att alla iOS- eller OS X-utvecklare är bekanta med NSURLSession och NSURLConnection, eftersom de är nyckelkomponenter på plattformen.

Även om NSURLSession API är bra och lätt att använda, de nätverks API som tillhandahålls av Foundation Framework är inte perfekta. Som Mattt påpekar, till och med NSURLSession API har några anmärkningsvärda luckor. AFNetworking försöker elegant fylla dessa luckor. Kombinationen av NSURLSession API och AFNetworking är ett äktenskap gjord i himlen. Det är verkligen en glädje att använda.

Jag gillar verkligen NSURLSession API och jag hoppas att jag har övertygat dig om sin kraft i den här serien. Detta betyder emellertid inte att AFNetworking har blivit föråldrad. Enligt min mening är AFNetworking den perfekta följeslagaren av NSURLSession API. AFNetworking har mognat och det är verkligen det bästa och mest robusta nätverksbiblioteket tillgängligt. Dess modulära arkitektur innebär att du inte behöver inkludera varje klass eller kategori som den har att erbjuda. Du kan välja och välja bland de komponenter som ingår. AFNetworking stöder CocoaPods subspecs, vilket gör denna process trivial.


Slutsats

Jag kunde inte vara mer lycklig med den andra stora utgåvan av AFNetworking. Bibliotekets modularitet och ansvarsfördelning är det som gör att det lyser enligt min åsikt. Det kompletterar NSURLSession API så bra att du inte ens märker att du använder AFNetworking. Mattt Thompson och de över 130 bidragsgivarna till AFNetworking har gjort ett formidabelt jobb. Det är bra att vara en kakaoutvecklare.