Werken met NSURLSession AFNetworking 2.0

In de vorige afleveringen van deze serie hebben we het NSURLSession API geïntroduceerd in iOS 7 en OS X Mavericks. Netwerken op iOS en OS X is veel eenvoudiger en flexibeler geworden dankzij de NSURLSession API. Betekent dit dat u moet stoppen met het gebruik van AFNetworking voor uw netwerkbehoeften? En hoe zit het met AFNetworking 2.0, dat een paar maanden geleden werd geïntroduceerd? In deze laatste aflevering zal ik je vertellen over AFNetworking 2.0 en hoe het zich verhoudt tot de NSURLSession API.


Invoering

Zoals Mattt Thompson op NSHipster aantoont, is AFNetworking de de facto netwerkbibliotheek geworden voor Cocoa-toepassingen. Op het moment van schrijven heeft de bibliotheek 10.000 sterren overtroffen op GitHub en is deze bijna 3.000 keer gevorkt.

Als u AFNetworking nog niet kent en graag meer wilt lezen over de geschiedenis en functies, dan raad ik aan Mattt's artikel over AFNetworking 2.0 op NSHipster te lezen. In dit artikel wil ik me concentreren op twee aspecten, wat is nieuw in AFNetworking 2.0 en hoe is het te vergelijken met de NSURLSession API. De vraag die je jezelf zou moeten stellen is "Moet ik AFNetworking nog steeds gebruiken met NSURLSession in mijn gereedschapskist? "Dat is de vraag die ik in dit artikel wil beantwoorden.


Vereisten

Voordat we nader bekijken wat AFNetworking 2.0 te bieden heeft, is het belangrijk om te weten wat de nieuwe vereisten van de bibliotheek zijn. Het zou geen verrassing moeten zijn dat de vereisten van AFNetworking 2.0 strenger zijn dan die van AFNetworking 1.x. Zoals het versienummer aangeeft, omvat AFNetworking het breken van wijzigingen, die het resultaat zijn van de nieuwe architectuur. Dit betekent ook dat het migreren van een project van AFNetworking 1.x naar 2.0 met de nodige voorzichtigheid moet gebeuren. De migratiegids is de ideale plaats om te starten als u van plan bent om een ​​project te migreren naar AFNetworking 2.0.

AFNetworking ondersteunt niet langer iOS 4.3 en 5. De minimale implementatiedoelen voor iOS en OS X zijn respectievelijk iOS 6 en OS X 10.8. AFNetworking 2.0 vereist ook Xcode 5. Als je nog steeds Xcode 4 gebruikt, is dit misschien een goed moment om over te stappen naar Xcode 5.


Solid Foundation

AFURLConnectionOperation

Zoals velen van jullie waarschijnlijk weten, is AFNetworking er bovenop gebouwd NSURLConnection en NSOperation, wat een krachtige en elegante combinatie is gebleken. Het resultaat van deze combinatie is AFURLConnectionOperation, een NSOperation subklasse die een beheert NSURLConnection bijvoorbeeld en implementeert de NSURLConnectionDelegate protocol. Hoewel deze robuuste basis ongewijzigd blijft in AFNetworking 2.0, wordt deze aangevuld met de NSURLSession API, die ik later in meer detail zal behandelen.

Scheiding van verantwoordelijkheden

In AFNetworking 1.x, de AFHTTPRequestOperation De klas had de leiding over het aanvragen van en de respons serialisatie en validatie. Dit is niet langer het geval in AFNetworking 2.0. De AFHTTPRequestOperation klasse en de subklassen zijn niet langer direct verantwoordelijk voor het serialiseren en valideren van verzoeken en antwoorden. Deze verantwoordelijkheid is verplaatst naar de AFURLRequestSerialization en AFURLResponseSerialization protocols. Elk protocol declareert een enkele gedelegeerde methode om resp. Serialisatie en validatie van aanvragen en antwoorden af ​​te handelen.

Om uw leven gemakkelijker te maken, wordt AFNetworking 2.0 meegeleverd AFHTTPRequestSerializer en AFHTTPResponseSerializer evenals een aantal subklassen voor algemene inhoudstypen, zoals JSON en XML. Om te zien hoe dit in de praktijk werkt, laten we een voorbeeld bekijken waarin ik de Forecast-API bevraag. Dit ziet er niet heel anders uit dan hoe je een verzoek hebt ingediend bij AFNetworking 1.x. Het belangrijkste verschil is dat je de AFHTTPRequestOperation klas vaker. De AFJSONRequestOperation en AFXMLRequestOperation klassen zijn niet langer aanwezig in AFNetworking 2.0.

 NSString * -sleutel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", key]]; // Initialize Request Operation AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Bewerkingsverzoek configureren [requestOperation setResponseSerializer: [AFJSONResponse Serializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (AFHTTPRequestOperation * -bewerking, id-responseObject) // Process Response Object -fout: ^ (AFHTTPRequestOperation * -bewerking, NSError * -fout) // Handle Error]; // Start Request Operation [requestoperation start];

De AFJSONResponseSerializer klasse erft van AFHTTPResponseSerializer en moet worden gebruikt voor JSON-antwoorden. Als u XML-antwoorden moet verwerken, dan AFXMLNResponseSerializer zal je helpen. Voor andere inhoudstypen moet u een subklasse maken AFHTTPResponseSerializer.

AFHTTPRequestOperationManager

Een andere grote verandering in AFNetworking 2.0 is het verwijderen van de AFHTTPClient klas, die de leiding had over het praten met webservices. De verantwoordelijkheden van AFHTTPClient zijn opgesplitst in een aantal klassen en protocollen. Om met een webservice te praten, gebruikt u nu AFHTTPRequestOperationManager en AFHTTPSessionManager. Net als AFHTTPRequestOperation, AFHTTPRequestOperationManager en AFHTTPSessionManager delegeren van serialisatie van verzoeken en antwoorden op afzonderlijke objecten. Beide AFHTTPRequestOperationManager en AFHTTPSessionManager heb een requestSerializer en responseSerializer eigendom voor dit doel. Laten we het bovenstaande voorbeeld opnieuw bekijken om te zien hoe dit in de praktijk werkt.

 NSString * -sleutel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/", key]]; // Initialize Request Operation Manager AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: baseURL]; // Configure Request Operation Manager [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Send Request [manager GET: @ "37.8267, -122.423" parameters: nul succes: ^ (AFHTTPRequestOperation * bewerking, id responseObject) // Process Response Object mislukt: ^ (AFHTTPRequestOperation * -bewerking, NSError * -fout) / / Handle Error];

Hoe zit het met NSURLSession?

AFURLSessionManager

De centrale vraag bij het bespreken van AFNetworking 2.0 in het licht van de NSURLSession API is of we AFNetworking nog nodig hebben. AFNetworking voegt een aantal gemaksklassen en methoden toe aan de NSURLSession API en dit is alleen mogelijk dankzij de scheiding van verantwoordelijkheden die ik eerder heb besproken. De belangrijkste verbetering die AFNetworking biedt bovenop de NSURLSession API zijn de AFURLSessionManager en AFHTTPSessionManager klassen.

De AFURLSessionManager helpt u een te beheren NSURLSession voorwerp. Ook al houd ik van de NSURLSession API, ik ben het met Mattt eens dat zijn API onvolledig is. De AFURLSessionManager klasse voegt een aantal gemaksmethoden toe die de NSURLSession API nog beter. Serialisatie en validatie zijn bijvoorbeeld veel eenvoudiger en intuïtiever met AFNetworking. Net als de AFHTTPRequestOperationManager, Instanties van AFURLSessionManager heb een requestSerializer en responseSerializer eigenschap die serialisatie van verzoeken en antwoorden naadloos en intuïtief maakt.

 NSString * -sleutel = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", key]]; // Initialiseer sessieconfiguratie NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Sessiebeheer initialiseren AFURLSessionManager * manager = [[AFURLSessionManager-toewijzing] initWithSessionConfiguration: sessionConfiguration]; // Configure Manager [manager setResponseSerializer: [AFJSONResponse Serializer serializer]]; // Send Request NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[manager dataTaskWithRequest: request completionHandler: ^ (NSURLResponse * response, id responseObject, NSError * error) // Process Response Object] cv];

Ik hoop dat je het voordeel zult zien van het gebruik van AFNetworking in combinatie met de NSURLSession API. Het maakt werken met de NSURLSession API veel intuïtiever, vooral als je al gewend bent aan de manier waarop AFNetworking 2.0 serialisatie en validatie scheidt van de feitelijke taak of verzoekbewerking.

AFHTTPSessionManager

AFNetworking 2.0 omvat ook een subklasse van AFURLSessionManager, AFHTTPSessionManager, waardoor interactie met webservices een fluitje van een cent wordt. De AFHTTPSessionManager klasse bevat een aantal gemakken methoden, zoals GET: parameters: succes: mislukking: en POST: parameters: constructingBodyWithBlock: succes: mislukking: die het migratieproces van maken AFHTTPClient naar AFHTTPSessionManager gemakkelijk. Vergelijkbare methoden zijn ook beschikbaar in de AFHTTPRequestOperationManager klasse, die ik eerder heb besproken.


bereikbaarheid

Bereikbaarheid wordt beheerd door de AFURLRequestOperationManager en AFURLSessionManager klassen. Wanneer exemplaren van deze klassen geldig zijn baseURL, dan wordt een bereikbaarheidsmanager automatisch geïnstantieerd en ingesteld. Natuurlijk is het ook mogelijk om expliciet een instantie van de te maken AFNetworkReachabilityManager klasse.


Icing On The Cake

AFNetworking 2.0 heeft een aantal andere functies, zoals ingebouwde ondersteuning voor SSL-pinning en verschillende categorieën op UIKit-klassen. Bekijk dit voorbeeld waarin ik gebruik maak van de categorie AFNetworking UIProgressView om een ​​voortgangsweergave bij te werken tijdens het downloaden van een externe afbeelding.

 // Initialiseer Verzoek NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Sessiebeheer initialiseren self.sessionManager = [[AFURLSessionManager-toewijzing] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Initialiseer downloadtaak NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: vraag voortgang: nulbestemming: ^ NSURL * (NSURL * targetPath, NSURLResponse * antwoord) // Succesvol verwerken completionHandler: ^ (reactie NSURLResponse *, NSURL * filePath , NSError * -fout) // Handvatfout]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask geanimeerd: YES]; [downloadTask CV];

Vonnis

Als uw project niet afhankelijk is van netwerken, heeft u niet alle kracht en gemak nodig die AFNetworking u te bieden heeft. Ik denk trouwens dat het belangrijk is dat elke iOS- of OS X-ontwikkelaar bekend is NSURLSession en NSURLConnection, omdat ze belangrijke componenten van het platform zijn.

Hoewel het NSURLSession API is geweldig en gemakkelijk te gebruiken, de netwerk-API's die door het Foundation-framework worden geboden, zijn niet perfect. Zoals Mattt opmerkt, zelfs de NSURLSession API heeft een paar opmerkelijke hiaten. AFNetworking probeert deze hiaten elegant in te vullen. De combinatie van de NSURLSession API en AFNetworking is een huwelijk in de hemel. Het is echt een genot om te gebruiken.

Ik vind het echt leuk NSURLSession API en ik hoop dat ik je overtuigd heb van zijn kracht in deze serie. Dit betekent echter niet dat AFNetworking overbodig is geworden. Naar mijn mening is AFNetworking de perfecte metgezel van de NSURLSession API. AFNetworking is volwassen geworden en het is inderdaad de beste en meest robuuste netwerkbibliotheek die beschikbaar is. De modulaire architectuur betekent dat u niet elke categorie of categorie hoeft op te nemen die deze te bieden heeft. U bent vrij om te kiezen uit de componenten die het bevat. AFNetworking ondersteunt de subspecs van CocoaPods, die dit proces triviaal maken.


Conclusie

Ik zou niet blijer kunnen zijn met de tweede grote release van AFNetworking. De modulariteit van de bibliotheek en de scheiding van verantwoordelijkheden laten haar naar mijn mening schijnen. Het vult de NSURLSession API zo goed dat je niet eens merkt dat je AFNetworking gebruikt. Mattt Thompson en de meer dan 130 medewerkers van AFNetworking hebben een formidabele klus geklaard. Het is goed om een ​​Cocoa-ontwikkelaar te zijn.