Nelle puntate precedenti di questa serie, abbiamo esaminato attentamente il NSURLSession
API introdotta in iOS 7 e OS X Mavericks. Il networking su iOS e OS X è diventato molto più semplice e flessibile grazie a NSURLSession
API. Questo significa che dovresti smettere di usare AFNetworking per le tue esigenze di rete? E che dire di AFNetworking 2.0, che è stato introdotto pochi mesi fa? In questa ultima puntata, ti parlerò di AFNetworking 2.0 e di come si confronta con NSURLSession
API.
Come sottolinea Mattt Thompson su NSHipster, AFNetworking è diventato di fatto la libreria di rete per le applicazioni Cocoa. Al momento della scrittura, la biblioteca ha superato 10.000 stelle su GitHub ed è stata biforcuta vicino a 3.000 volte.
Se sei nuovo su AFNetworking e vorresti leggere di più sulla sua storia e sulle sue funzionalità, ti suggerisco di leggere il post di Mattt su AFNetworking 2.0 su NSHipster. In questo articolo, vorrei concentrarmi su due aspetti, cosa c'è di nuovo in AFNetworking 2.0 e in che modo si confronta con NSURLSession
API. La domanda che dovresti porci è "Devo ancora usare AFNetworking con NSURLSession
nella mia cassetta degli attrezzi? "Questa è la domanda che intendo rispondere in questo articolo.
Prima di dare un'occhiata più da vicino a ciò che AFNetworking 2.0 ha da offrire, è importante conoscere i nuovi requisiti della biblioteca. Non dovrebbe sorprendere il fatto che i requisiti di AFNetworking 2.0 siano più rigidi di quelli di AFNetworking 1.x. Come indica il numero di versione, AFNetworking include le modifiche di interruzione, che sono il risultato della sua nuova architettura. Ciò significa anche che la migrazione di un progetto da AFNetworking 1.x a 2.0 dovrebbe essere eseguita con cautela. La guida alla migrazione è il punto di partenza ideale se si pianifica la migrazione di un progetto in AFNetworking 2.0.
AFNetworking non supporta più iOS 4.3 e 5. I target minimi di implementazione per iOS e OS X sono rispettivamente iOS 6 e OS X 10.8. AFNetworking 2.0 richiede anche Xcode 5. Se stai ancora utilizzando Xcode 4, questo potrebbe essere un buon momento per effettuare la transizione a Xcode 5.
AFURLConnectionOperation
Come molti di voi probabilmente sanno, AFNetworking è costruito sopra NSURLConnection
e NSOperation
, che ha dimostrato di essere una combinazione potente ed elegante. Il risultato di questa combinazione è AFURLConnectionOperation
, un NSOperation
sottoclasse che gestisce un NSURLConnection
istanza e implementa il NSURLConnectionDelegate
protocollo. Anche se questa solida base rimane invariata in AFNetworking 2.0, è integrata da NSURLSession
API, che tratterò più dettagliatamente in seguito.
In AFNetworking 1.x, il file AFHTTPRequestOperation
la classe era responsabile della serializzazione e della convalida delle richieste e delle risposte. Questo non è più vero in AFNetworking 2.0. Il AFHTTPRequestOperation
classe e le sue sottoclassi non sono più direttamente responsabile della serializzazione e convalida di richieste e risposte. Questa responsabilità è stata trasferita al AFURLRequestSerialization
e AFURLResponseSerialization
protocolli. Ogni protocollo dichiara un singolo metodo delegato per gestire rispettivamente la serializzazione di richieste e risposte e la convalida.
Per semplificarti la vita, tuttavia, viene fornito con AFNetworking 2.0 AFHTTPRequestSerializer
e AFHTTPResponseSerializer
così come un certo numero di sottoclassi per tipi di contenuto comuni, come JSON e XML. Per vedere come funziona in pratica, diamo un'occhiata a un esempio in cui interrogo l'API di previsione. Questo non sembra molto diverso da come hai fatto una richiesta con AFNetworking 1.x. La differenza principale è che userete il AFHTTPRequestOperation
classe più spesso. Il AFJSONRequestOperation
e AFXMLRequestOperation
le classi non sono più presenti in AFNetworking 2.0.
Chiave NSString * = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; URL NSURL * = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", chiave]]; // Initialize Request Operation AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest: [NSURLRequequest requestWithURL: URL]]; // Configura operazione richiesta [requestOperation setResponseSerializer: [AFJSONResponseSerializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (AFHTTPRequestOperation * operazione, id responseObject) // Process Response Object errore: ^ (operazione AFHTTPRequestOperation *, errore NSError *) // Handle Error]; // Operazione di richiesta di avvio [requestOperation start];
Il AFJSONResponseSerializer
la classe eredita da AFHTTPResponseSerializer
e dovrebbe essere usato per le risposte JSON. Se hai bisogno di elaborare risposte XML, allora AFXMLNResponseSerializer
ti aiuterà. Per altri tipi di contenuti, è necessario sottoclasse AFHTTPResponseSerializer
.
AFHTTPRequestOperationManager
Un altro importante cambiamento in AFNetworking 2.0 è la rimozione di AFHTTPClient
classe, che era incaricato di parlare con i servizi web. Le responsabilità di AFHTTPClient
sono stati suddivisi in un numero di classi e protocolli. Per parlare con un servizio web, ora lo usi AFHTTPRequestOperationManager
e AFHTTPSessionManager
. Proprio come AFHTTPRequestOperation
, AFHTTPRequestOperationManager
e AFHTTPSessionManager
delegare la serializzazione di richieste e risposte a oggetti separati. Tutti e due AFHTTPRequestOperationManager
e AFHTTPSessionManager
avere un requestSerializer
e responseSerializer
proprietà per questo scopo. Rivediamo l'esempio precedente per vedere come funziona in pratica.
Chiave NSString * = @ "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]]; // Invia richiesta [gestore GET: @ "37.8267, -122.423" parametri: nil successo: ^ (AFHTTPRequestOperation * operazione, id responseObject) // Process Response Object errore: ^ (operazione AFHTTPRequestOperation *, errore NSError *) / / Handle Error];
NSURLSession
?AFURLSessionManager
La domanda chiave quando si discute di AFNetworking 2.0 alla luce del NSURLSession
API è se abbiamo ancora bisogno di AFNetworking. AFNetworking aggiunge un numero di classi e metodi di convenienza a NSURLSession
API e questo è possibile solo grazie alla separazione delle responsabilità che ho discusso in precedenza. Il miglioramento più significativo che AFNetworking offre in cima al NSURLSession
API sono i AFURLSessionManager
e AFHTTPSessionManager
classi.
Il AFURLSessionManager
ti aiuta a gestire un NSURLSession
oggetto. Anche se amo il NSURLSession
API, devo concordare con Mattt che la sua API è incompleta. Il AFURLSessionManager
la classe aggiunge una serie di metodi di convenienza che rendono il NSURLSession
API ancora meglio. La serializzazione e la convalida, ad esempio, sono molto più semplici e intuitive con AFNetworking. Proprio come il AFHTTPRequestOperationManager
, istanze di AFURLSessionManager
avere un requestSerializer
e responseSerializer
proprietà che rende la serializzazione di richieste e risposte senza soluzione di continuità e intuitiva.
Chiave NSString * = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; URL NSURL * = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", chiave]]; // Inizializza la configurazione della sessione NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Initialize Session Manager AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration: sessionConfiguration]; // Configure Manager [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Invia richiesta NSURLRequest * request = [NSURLRequequest requestWithURL: URL]; [[manager dataTaskWithRequest: request completionHandler: ^ (risposta NSURLResponse *, id responseObject, errore NSError *) // Process Response Object] curriculum];
Spero che tu possa vedere il vantaggio di utilizzare AFNetworking in combinazione con il NSURLSession
API. Rende il lavoro con NSURLSession
API molto più intuitiva, specialmente se sei già abituato al modo in cui AFNetworking 2.0 separa la serializzazione e la convalida dall'attività effettiva o dall'operazione di richiesta.
AFHTTPSessionManager
AFNetworking 2.0 include anche una sottoclasse di AFURLSessionManager
, AFHTTPSessionManager
, che rende l'interazione con i servizi web un gioco da ragazzi. Il AFHTTPSessionManager
la classe include un numero di metodi di convenienza, come GET: parametri: il successo: il fallimento:
e POST: parametri: constructingBodyWithBlock: il successo: il fallimento:
da cui parte il processo di migrazione AFHTTPClient
a AFHTTPSessionManager
facile. Metodi simili sono disponibili anche in AFHTTPRequestOperationManager
classe, che ho discusso in precedenza.
La raggiungibilità è gestita dal AFURLRequestOperationManager
e AFURLSessionManager
classi. Quando le istanze di queste classi hanno un valore valido baseURL
, quindi un gestore di raggiungibilità viene automaticamente istanziato e impostato. Naturalmente, è anche possibile creare in modo esplicito un'istanza di AFNetworkReachabilityManager
classe.
AFNetworking 2.0 ha una serie di altre funzionalità, come il supporto integrato per il blocco SSL e varie categorie sulle classi UIKit. Dai un'occhiata a questo esempio in cui utilizzo la categoria di AFNetworking UIProgressView
per aggiornare una vista di avanzamento durante il download di un'immagine remota.
// Initialize Request NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Initialize Session Manager self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Inizializza Attività di download NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: avanzamento della richiesta: nil destinazione: ^ NSURL * (NSURL * targetPath, risposta NSURLResponse * // Handle Success completionHandler: ^ (risposta NSURLResponse *, NSURL * filePath , Errore NSError * // Handle Failure]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask animato: YES]; [download resask];
Se il tuo progetto non si basa sul networking, non avrai bisogno di tutta la potenza e la convenienza che AFNetworking ha da offrire. È un dato di fatto, penso che sia importante che ogni sviluppatore iOS o OS X abbia familiarità con NSURLSession
e NSURLConnection
, perché sono componenti chiave della piattaforma.
Anche se il NSURLSession
Le API sono grandi e facili da usare, le API di networking fornite dal framework Foundation non sono perfette. Come sottolinea Mattt, anche il NSURLSession
L'API presenta alcune lacune notevoli. AFNetworking cerca di riempire elegantemente queste lacune. La combinazione del NSURLSession
API e AFNetworking sono un matrimonio fatto in paradiso. È davvero una gioia da usare.
Mi piace molto il NSURLSession
API e spero di averti convinto del suo potere in questa serie. Tuttavia, questo non significa che AFNetworking sia diventato obsoleto. A mio parere, AFNetworking è il compagno perfetto di NSURLSession
API. AFNetworking è maturata ed è effettivamente la migliore e più robusta libreria di rete disponibile. La sua architettura modulare significa che non è necessario includere ogni classe o categoria che ha da offrire. Sei libero di scegliere tra i componenti che include. AFNetworking supporta i subspec di CocoaPods, che rendono banale questo processo.
Non potrei essere più contento della seconda importante release di AFNetworking. La modularità e la separazione delle responsabilità della biblioteca è ciò che lo fa brillare secondo me. Completa il NSURLSession
API così bene che non ti accorgerai nemmeno che stai utilizzando AFNetworking. Mattt Thompson e gli oltre 130 collaboratori di AFNetworking hanno svolto un lavoro formidabile. È bello essere uno sviluppatore di Cocoa.