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