Arbeider med NSURLSession AFNetworking 2.0

I de forrige delene av denne serien har vi tatt en nærmere titt på NSURLSession API introdusert i iOS 7 og OS X Mavericks. Nettverk på iOS og OS X har blitt mye enklere og mer fleksibelt takket være NSURLSession API. Betyr dette at du bør slutte å bruke AFNetworking for nettverksbehov? Og hva med AFNetworking 2.0, som ble introdusert for noen måneder siden? I denne siste avdrag vil jeg fortelle deg om AFNetworking 2.0 og hvordan det sammenlignes med NSURLSession API.


Introduksjon

Som Mattt Thompson peker på NSHipster, har AFNetworking blitt de facto nettverksbiblioteket for kakao applikasjoner. På tidspunktet for skriving har biblioteket overgått 10.000 stjerner på GitHub og ble forked nær 3000 ganger.

Hvis du er ny til AFNetworking og vil gjerne lese mer om sin historie og funksjoner, foreslår jeg å lese Matts innlegg om AFNetworking 2.0 på NSHipster. I denne artikkelen vil jeg fokusere på to aspekter, hva er nytt i AFNetworking 2.0 og hvordan sammenligner det med NSURLSession API. Spørsmålet du burde spørre deg selv er "Skal jeg fortsatt bruke AFNetworking med NSURLSession i min verktøykasse? "Det er spørsmålet jeg planlegger å svare i denne artikkelen.


Krav

Før vi tar en nærmere titt på hva AFNetworking 2.0 har å tilby, er det viktig å vite om bibliotekets nye krav. Det bør ikke være en overraskelse at kravene til AFNetworking 2.0 er strengere enn AFNetworking 1.x. Som versjonsnummer indikerer, inkluderer AFNetworking bryteendringer, som er resultatet av den nye arkitekturen. Dette innebærer også at det skal utføres forsiktighet med å migrere et prosjekt fra AFNetworking 1.x til 2.0. Migreringsveiledningen er det ideelle stedet å starte hvis du planlegger å migrere et prosjekt til AFNetworking 2.0.

AFNetworking støtter ikke lenger iOS 4.3 og 5. Minimum distribusjonsmål for iOS og OS X er henholdsvis iOS 6 og OS X 10.8. AFNetworking 2.0 krever også Xcode 5. Hvis du fortsatt bruker Xcode 4, kan dette være en god tid å gjøre overgangen til Xcode 5.


Solid grunnmur

AFURLConnectionOperation

Som mange av dere sikkert vet, er AFNetworking bygget på toppen av NSURLConnection og NSOperation, som har vist seg å være en kraftig og elegant kombinasjon. Resultatet av denne kombinasjonen er AFURLConnectionOperation, en NSOperation underklasse som administrerer en NSURLConnection forekommer og implementerer NSURLConnectionDelegate protokoll. Selv om dette robuste fundamentet forblir uendret i AFNetworking 2.0, suppleres det av NSURLSession API, som jeg vil dekke mer detaljert senere.

Adskillelse av ansvar

I AFNetworking 1.x, the AFHTTPRequestOperation Klassen var ansvarlig for forespørsel og respons serialisering og validering. Dette er ikke lenger sant i AFNetworking 2.0. De AFHTTPRequestOperation klassen og dens underklasser er ikke lenger direkte ansvarlig for serialisering og validering av forespørsler og svar. Dette ansvaret er flyttet til AFURLRequestSerialization og AFURLResponseSerialization protokoller. Hver protokoll erklærer en enkelt delegatemetode for å håndtere forespørsel og respons serialisering og validering henholdsvis.

For å gjøre livet enklere, leveres AFNetworking 2.0 med AFHTTPRequestSerializer og AFHTTPResponseSerializer samt en rekke underklasser for vanlige innholdstyper, for eksempel JSON og XML. For å se hvordan dette virker i praksis, la oss se på et eksempel der jeg spørre prognose-API. Dette ser ikke så forskjellig ut fra hvordan du gjorde en forespørsel med AFNetworking 1.x. Hovedforskjellen er at du skal bruke AFHTTPRequestOperation klasse oftere. De AFJSONRequestOperation og AFXMLRequestOperation Klasser er ikke lenger til stede i AFNetworking 2.0.

 NSString * nøkkel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", nøkkel]]; // Initialiser forespørsel Operasjon AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation allokering] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Konfigurer forespørselsoperasjon [requestOperation setResponseSerializer: [AFJSONResponseSerializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (AFHTTPRequestOperation * -operasjon, id responseObject) // Process Response Object feil: ^ (AFHTTPRequestOperation * -operasjon, NSError * -feil) // Handle Error]; // Start Request Operation [requestOperation start];

De AFJSONResponseSerializer Klassen arver fra AFHTTPResponseSerializer og skal brukes til JSON-svar. Hvis du trenger å behandle XML-svar, så AFXMLNResponseSerializer vil hjelpe deg ut. For andre innholdstyper må du underklasse AFHTTPResponseSerializer.

AFHTTPRequestOperationManager

En annen stor endring i AFNetworking 2.0 er fjerning av AFHTTPClient klassen, som var ansvarlig for å snakke med webtjenester. Ansvaret for AFHTTPClient har blitt delt opp i en rekke klasser og protokoller. For å snakke med en webtjeneste, bruker du nå AFHTTPRequestOperationManager og AFHTTPSessionManager. Akkurat som AFHTTPRequestOperation, AFHTTPRequestOperationManager og AFHTTPSessionManager delegere serialisering av forespørsler og svar på separate objekter. Både AFHTTPRequestOperationManager og AFHTTPSessionManager ha en requestSerializer og responseSerializer eiendom for dette formålet. La oss se på eksemplet ovenfor for å se hvordan dette fungerer i praksis.

 NSString * nøkkel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/", nøkkel]]; // Initialiser forespørsel Operasjonsbehandling AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: baseURL]; // Konfigurer forespørsel Operasjonsbehandling [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Send forespørsel [manager GET: @ "37.8267, -122.423" parametere: null suksess: ^ (AFHTTPRequestOperation * -operasjon, id responseObject) // Prosess Response Object feil: ^ (AFHTTPRequestOperation * -operasjon, NSError * -feil) / / Håndteringsfeil];

Hva med NSURLSession?

AFURLSessionManager

Nøkkelspørsmålet når vi diskuterer AFNetworking 2.0 i lys av NSURLSession API er om vi fortsatt trenger AFNetworking. AFNetworking legger til en rekke bekvemmelighetsklasser og metoder til NSURLSession API og dette er bare mulig takket være separasjonen av ansvar jeg diskuterte tidligere. Den viktigste forbedringen som AFNetworking gir på toppen av NSURLSession API er AFURLSessionManager og AFHTTPSessionManager klasser.

De AFURLSessionManager hjelper deg med å administrere en NSURLSession gjenstand. Selv om jeg elsker NSURLSession API, jeg må være enig med Mattt om at API-en er ufullstendig. De AFURLSessionManager Klassen legger til en rekke bekvemmelighetsmetoder som gjør NSURLSession API enda bedre. Serialisering og validering, for eksempel, er mye enklere og intuitiv med AFNetworking. Akkurat som AFHTTPRequestOperationManager, forekomster av AFURLSessionManager ha en requestSerializer og responseSerializer eiendom som gjør serialisering av forespørsler og svar sømløse og intuitive.

 NSString * nøkkel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", nøkkel]]; // Initialiser Session Configuration NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Initialiser Session Manager AFURLSessionManager * Manager = [[AFURLSessionManager alloc] initWithSessionConfiguration: sessionConfiguration]; // Configure Manager [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Send forespørsel NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[manager dataTaskWithRequest: request completionHandler: ^ (NSURLResponse * respons, id responseObject, NSError * feil) // Process Response Object] CV];

Jeg håper du kan se fordelene med å bruke AFNetworking i kombinasjon med NSURLSession API. Det gjør jobben med NSURLSession API mye mer intuitiv, spesielt hvis du allerede er vant til måten AFNetworking 2.0 skiller serialisering og validering fra den faktiske oppgaven eller forespørselsoperasjonen.

AFHTTPSessionManager

AFNetworking 2.0 inkluderer også en underklasse av AFURLSessionManager, AFHTTPSessionManager, som gjør interaksjon med webtjenester en bris. De AFHTTPSessionManager klassen inneholder en rekke bekvemmeligheter metoder, for eksempel GET: parametere: suksess: fiasko: og POST: parametere: constructingBodyWithBlock: suksess: fiasko: som gjør migreringsprosessen fra AFHTTPClient til AFHTTPSessionManager lett. Lignende metoder er også tilgjengelige i AFHTTPRequestOperationManager klassen, som jeg diskuterte tidligere.


reachability

Reachability administreres av AFURLRequestOperationManager og AFURLSessionManager klasser. Når forekomster av disse klassene har en gyldighet baseURL, så blir en rekkeviddehåndterer automatisk opprettet og satt opp. Selvfølgelig er det også mulig å eksplisitt lage en forekomst av AFNetworkReachabilityManager klasse.


Glasur på kaken

AFNetworking 2.0 har en rekke andre funksjoner, for eksempel innebygd støtte for SSL pinning og ulike kategorier på UIKit-klasser. Ta en titt på dette eksemplet der jeg bruker AFNetworkings kategori på UIProgressView for å oppdatere en fremdriftsvisning mens du laster ned et fjernbilde.

 // Initialiser forespørsel NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Initialiser Session Manager self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Initialiser nedlastingsoppgave NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: forespørsel fremgang: null destinasjon: ^ NSURL * (NSURL * targetPath, NSURLResponse * respons) // Håndtere suksess fullføringHandler: ^ (NSURLResponse * svar, NSURL * filePath , NSError * feil) // Handle Failure]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask animated: YES]; [downloadTask resume];

Kjennelse

Hvis prosjektet ikke er avhengig av nettverk, trenger du ikke all kraft og bekvemmelighet som AFNetworking har å tilby. Faktisk tror jeg det er viktig at alle iOS- eller OS X-utviklere er kjent med NSURLSession og NSURLConnection, fordi de er viktige komponenter på plattformen.

Selv om NSURLSession API er stor og enkel å bruke, nettverksgrensesnittene som er gitt av Foundation-rammen, er ikke perfekte. Som Mattt peker ut, selv NSURLSession API har noen bemerkelsesverdige hull. AFNetworking forsøker å fylle disse hullene elegant. Kombinasjonen av NSURLSession API og AFNetworking er et ekteskap i himmelen. Det er virkelig en glede å bruke.

Jeg liker virkelig NSURLSession API og jeg håper jeg har overbevist deg om sin kraft i denne serien. Dette betyr imidlertid ikke at AFNetworking har blitt foreldet. Etter min mening er AFNetworking den perfekte følgesvenn av NSURLSession API. AFNetworking har modnet og det er faktisk det beste og mest robuste nettverksbiblioteket tilgjengelig. Dens modulære arkitektur betyr at du ikke trenger å inkludere hver klasse eller kategori den har å tilby. Du kan velge og velge mellom komponentene som den inneholder. AFNetworking støtter CocoaPods subspecs, noe som gjør denne prosessen trivial.


Konklusjon

Jeg kunne ikke vært mer fornøyd med den andre store utgivelsen av AFNetworking. Bibliotekets modularitet og ansvarsfordeling er det som skinner etter min mening. Den utfyller NSURLSession API så godt at du ikke engang vil merke at du bruker AFNetworking. Mattt Thompson og de over 130 bidragsyterne til AFNetworking har gjort en formidabel jobb. Det er godt å være en kakaoutvikler.