Lucrul cu NSURLSession AFNetworking 2.0

În tranșele anterioare ale acestei serii, am analizat cu atenție NSURLSession API introdus în iOS 7 și OS X Mavericks. Lucrul în rețea pe iOS și OS X a devenit mult mai simplu și mai flexibil datorită NSURLSession API-ul. Acest lucru înseamnă că ar trebui să încetați să utilizați AFNetworking pentru nevoile de rețea? Și ce despre AFNetworking 2.0, care a fost introdus acum câteva luni? În această ultimă tranșă, vă voi spune despre AFNetworking 2.0 și cum se compară cu NSURLSession API-ul.


Introducere

Dupa cum Mattt Thompson subliniaza pe NSHipster, AFNetworking a devenit biblioteca de facto de retea pentru aplicatiile de cacao. La momentul scrisului, biblioteca a depășit 10.000 de stele pe GitHub și a fost furată aproape de 3.000 de ori.

Dacă sunteți nou la AFNetworking și doriți să citiți mai multe despre istoricul și caracteristicile sale, vă sugerăm să citiți postul lui Mattt despre AFNetworking 2.0 pe NSHipster. În acest articol, aș dori să mă axez pe două aspecte, ce este nou în AFNetworking 2.0 și cum se compară cu NSURLSession API. Întrebarea pe care ar trebui să vă întrebați este "Ar trebui să folosesc în continuare AFNetworking cu NSURLSession în cutia mea de instrumente? "Aceasta este întrebarea pe care intenționez să o răspund în acest articol.


cerinţe

Înainte de a examina mai îndeaproape ceea ce AFNetworking 2.0 are de oferit, este important să știți despre noile cerințe ale bibliotecii. Nu trebuie să fie o surpriză faptul că cerințele AFNetworking 2.0 sunt mai stricte decât cele ale AFNetworking 1.x. După cum arată numărul versiunii sale, AFNetworking include ruperea modificărilor, care sunt rezultatul arhitecturii sale noi. Acest lucru înseamnă, de asemenea, că migrarea unui proiect de la AFNetworking 1.x la 2.0 trebuie făcută cu prudență. Ghidul de migrare este locul ideal pentru a începe dacă intenționați să migrați un proiect la AFNetworking 2.0.

AFNetworking nu mai acceptă iOS 4.3 și 5. Destinațiile minime de implementare pentru iOS și OS X sunt iOS 6 și OS X 10.8, respectiv. AFNetworking 2.0 necesită, de asemenea, Xcode 5. Dacă utilizați în continuare Xcode 4, este posibil ca acesta să fie un moment bun pentru a face trecerea la Xcode 5.


Solid Foundation

AFURLConnectionOperation

După cum mulți dintre voi probabil știți, AFNetworking este construit pe partea de sus NSURLConnection și NSOperation, care sa dovedit a fi o combinație puternică și elegantă. Rezultatul acestei combinații este AFURLConnectionOperation, un NSOperation subclasa care gestionează o NSURLConnection instanță și implementează NSURLConnectionDelegate protocol. Chiar dacă această bază robustă rămâne neschimbată în AFNetworking 2.0, ea este completată de NSURLSession API, pe care o voi detalia mai târziu.

Separarea responsabilităților

În AFNetworking 1.x, AFHTTPRequestOperation clasa a fost responsabilă de serializarea și validarea cererilor și răspunsurilor. Acest lucru nu mai este valabil în AFNetworking 2.0. AFHTTPRequestOperation clasa și subclasele sale nu mai sunt direct responsabil pentru serializarea și validarea cererilor și răspunsurilor. Această responsabilitate a fost mutată la AFURLRequestSerialization și AFURLResponseSerialization protocoale. Fiecare protocol declară o singură metodă de delegat pentru a gestiona serializarea și validarea cererilor și răspunsurilor.

Pentru a vă ușura viața, cu toate acestea, AFNetworking 2.0 este livrat cu AFHTTPRequestSerializer și AFHTTPResponseSerializer precum și un număr de subclase pentru tipuri de conținut obișnuite, cum ar fi JSON și XML. Pentru a vedea cum funcționează acest lucru în practică, să aruncăm o privire la un exemplu în care interoghez API-ul Forecast. Acest lucru nu pare diferit de modul în care ați făcut o solicitare cu AFNetworking 1.x. Principala diferență este că veți folosi AFHTTPRequestOperation clasa mai des. AFJSONRequestOperation și AFXMLRequestOperation clasele nu mai sunt prezente în AFNetworking 2.0.

 NSString * cheie = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", cheie]]; // Initializați operația de solicitare AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Configurați operația de solicitare [requestOperation setResponseSerializer: [AFJSONResponseSerializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (operațiunea AFHTTPRequestOperation *, id responseObject) // Process Response Object eșec: ^ (funcționare AFHTTPRequestOperation *, eroare NSError *) // Error Handle; // începe operația de solicitare [start requestOperation];

AFJSONResponseSerializer clasa moșteni de la AFHTTPResponseSerializer și ar trebui să fie utilizate pentru răspunsurile JSON. Dacă trebuie să procesați răspunsurile XML, atunci AFXMLNResponseSerializer te va ajuta. Pentru alte tipuri de conținut, aveți nevoie de subclasă AFHTTPResponseSerializer.

AFHTTPRequestOperationManager

O altă schimbare majoră în AFNetworking 2.0 este eliminarea AFHTTPClient clasa, care a fost responsabil de a vorbi cu servicii web. Responsabilitățile companiei AFHTTPClient au fost împărțite într-o serie de clase și protocoale. Pentru a vorbi cu un serviciu web, utilizați acum AFHTTPRequestOperationManager și AFHTTPSessionManager. Ca și cum AFHTTPRequestOperation, AFHTTPRequestOperationManager și AFHTTPSessionManager să delege serializarea cererilor și a răspunsurilor la obiecte separate. Ambii AFHTTPRequestOperationManager și AFHTTPSessionManager ia o requestSerializer și responseSerializer proprietate în acest scop. Să revedem exemplul de mai sus pentru a vedea cum funcționează acest lucru în practică.

 NSString * cheie = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%7/", cheie]]; // Initializeaza managerul de operatiuni de cerere AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: baseURL]; // Configurați managerul de operațiuni de solicitare [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Trimite cererea [manager GET: @ "37.8267, -122.423" parametrii: succes nil: ^ (AFHTTPRequestOperation * operație, id responseObject) // Process Response Object eșec: ^ (operație AFHTTPRequestOperation *, eroare NSError * / Eroare de manipulare];

Ce ziceti NSURLSession?

AFURLSessionManager

Întrebarea cheie atunci când se discută AFNetworking 2.0 în lumina NSURLSession API este dacă mai avem nevoie de AFNetworking. AFNetworking adaugă o serie de clase și metode de comoditate la NSURLSession API și acest lucru este posibil numai datorită separării responsabilităților discutate mai devreme. Cea mai importantă îmbunătățire pe care AFNetworking o oferă în partea de sus a NSURLSession API sunt AFURLSessionManager și AFHTTPSessionManager clase.

AFURLSessionManager vă ajută să gestionați un NSURLSession obiect. Chiar dacă îmi place NSURLSession API, trebuie să fiu de acord cu Mattt că API-ul său este incomplet. AFURLSessionManager clasa adaugă o serie de metode de confort care fac NSURLSession API chiar mai bine. Serializarea și validarea, de exemplu, sunt mult mai ușor și mai intuitive cu AFNetworking. La fel ca și AFHTTPRequestOperationManager, instances of AFURLSessionManager ia o requestSerializer și responseSerializer proprietate care face serializarea cererilor și răspunsurilor fără probleme și intuitive.

 NSString * cheie = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", cheie]]; // Initializați configurarea sesiunii NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Initializează managerul sesiunii AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration: sessionConfiguration]; // Configurează managerul [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Trimite cererea NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[date managerTaskWithRequest: request completionHandler: ^ (NSURLResponse * răspuns, id responseObject, eroare NSError *) // Process Response Object] resume];

Sper că puteți vedea beneficiul utilizării AFNetworking în combinație cu NSURLSession API-ul. Lucrează cu NSURLSession API mult mai intuitiv, mai ales dacă sunteți deja obișnuiți cu modul în care AFNetworking 2.0 separă serializarea și validarea de sarcina reală sau operațiunea de solicitare.

AFHTTPSessionManager

AFNetworking 2.0 include, de asemenea, o subclasă de AFURLSessionManager, AFHTTPSessionManager, ceea ce face o interacțiune cu serviciile web o briza. AFHTTPSessionManager clasa include o serie de metode de conveniență, cum ar fi GET: parametri: succes: eșec: și POST: Parametrii: constructingBodyWithBlock: succes: eșec: care fac din procesul de migrare AFHTTPClient la AFHTTPSessionManager uşor. Metode similare sunt de asemenea disponibile în AFHTTPRequestOperationManager clasa, pe care am discutat-o ​​mai devreme.


accesibilitate

Reabilitatea este gestionată de AFURLRequestOperationManager și AFURLSessionManager clase. Când instanțele din aceste clase au valabilitate baseURL, apoi un manager de disponibilitate este instanțiat și setat automat. Desigur, este posibil, de asemenea, să creați în mod explicit o instanță a AFNetworkReachabilityManager clasă.


Icing pe tort

AFNetworking 2.0 are o serie de alte caracteristici, cum ar fi suportul încorporat pentru fixarea SSL și diverse categorii pe clase UIKit. Aruncati o privire la acest exemplu in care folosesc categoria AFNetworking UIProgressView pentru a actualiza o vizualizare de progres în timpul descărcării unei imagini la distanță.

 // Solicitați inițializarea NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Initializeaza managerul sesiunii self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Initializeaza sarcina de download NSURLSessionDownloadTask * downloadTask = [auto.sessionManager downloadTaskWithRequest: request progress: null destinatie: ^ NSURL * (NSURL * targetPath, NSURLResponse * response) // Handle Success completionHandler: ^ (NSURLResponse * , Eroare NSError *) / Handle Failure]; [auto.progressViz setProgressWithDownloadProgressOfTask: downloadTask animat: YES]; [reluarea descărcăriiTask];

Verdict

Dacă proiectul dvs. nu se bazează pe crearea de rețele, atunci nu veți avea nevoie de toată puterea și comoditatea pe care AFNetworking le poate oferi. De fapt, cred că este important ca fiecare dezvoltator iOS sau OS X să fie familiarizat NSURLSession și NSURLConnection, deoarece acestea sunt componente cheie ale platformei.

Chiar dacă NSURLSession API este mare și ușor de utilizat, API-urile de rețea furnizate de cadrul Fundației nu sunt perfecte. După cum subliniază Mattt, chiar și NSURLSession API are câteva lacune notabile. AFNetworking încearcă să umple elegant aceste lacune. Combinația dintre NSURLSession API și AFNetworking este o căsătorie făcută în ceruri. Este cu adevărat o bucurie de a folosi.

Îmi place foarte mult NSURLSession API și sper că v-am convins de puterea sa în această serie. Cu toate acestea, aceasta nu înseamnă că AFNetworking a devenit depășită. În opinia mea, AFNetworking este partenerul perfect al NSURLSession API-ul. AFNetworking sa maturizat și este într-adevăr cea mai bună și mai robustă bibliotecă de rețea disponibilă. Arhitectura sa modulară înseamnă că nu trebuie să includeți toate clasele sau categoriile pe care le poate oferi. Puteți alege și alege din componentele pe care le include. AFNetworking susține subspecii CocoaPods, care fac acest proces trivial.


Concluzie

Nu puteam fi mai multumit de cea de-a doua lansare majoră a rețelei AFNetworking. Modularitatea bibliotecii și separarea responsabilităților este ceea ce face să strălucească în opinia mea. Se completează NSURLSession API atât de bine încât nici măcar nu veți observa că utilizați AFNetworking. Mattt Thompson și cei peste 130 de colaboratori ai AFNetworking au făcut o treabă formidabilă. Este bine să fii dezvoltator de cacao.

Cod