Utilizzo di NSURLSession AFNetworking 2.0

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.


introduzione

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.


Requisiti

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.


Solide fondamenta

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.

Separazione delle responsabilità

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

Che dire 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.


raggiungibilità

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.


Glassa sulla torta

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

Verdetto

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.


Conclusione

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.