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