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