En las entregas anteriores de esta serie, hemos examinado de cerca el SESIÓN
API introducida en iOS 7 y OS X Mavericks. La red en iOS y OS X se ha vuelto mucho más simple y más flexible gracias a la SESIÓN
API. ¿Significa esto que debe dejar de usar AFNetworking para sus necesidades de red? ¿Y qué pasa con AFNetworking 2.0, que se introdujo hace unos meses? En esta última entrega, les contaré sobre AFNetworking 2.0 y cómo se compara con el SESIÓN
API.
Como Mattt Thompson señala en NSHipster, AFNetworking se ha convertido en la biblioteca de redes de facto para las aplicaciones Cocoa. Al momento de escribir, la biblioteca ha superado las 10,000 estrellas en GitHub y fue bifurcada cerca de 3,000 veces.
Si es nuevo en AFNetworking y desea leer más sobre su historial y características, le sugiero que lea la publicación de Mattt sobre AFNetworking 2.0 en NSHipster. En este artículo, me gustaría centrarme en dos aspectos, lo que es nuevo en AFNetworking 2.0 y cómo se compara con el SESIÓN
API. La pregunta que debe hacerse es "¿Debería seguir utilizando AFNetworking con SESIÓN
en mi caja de herramientas? "Esa es la pregunta que planeo responder en este artículo.
Antes de echar un vistazo más de cerca a lo que AFNetworking 2.0 tiene para ofrecer, es importante conocer los nuevos requisitos de la biblioteca. No debería sorprender que los requisitos de AFNetworking 2.0 sean más estrictos que los de AFNetworking 1.x. Como lo indica su número de versión, AFNetworking incluye cambios de última hora, que son el resultado de su nueva arquitectura. Esto también significa que la migración de un proyecto de AFNetworking 1.x a 2.0 debe realizarse con precaución. La guía de migración es el lugar ideal para comenzar si planea migrar un proyecto a AFNetworking 2.0.
AFNetworking ya no admite iOS 4.3 y 5. Los objetivos de implementación mínimos para iOS y OS X son iOS 6 y OS X 10.8 respectivamente. AFNetworking 2.0 también requiere Xcode 5. Si aún usas Xcode 4, este puede ser un buen momento para hacer la transición a Xcode 5.
AFURLConnectionOperation
Como muchos de ustedes saben, AFNetworking está construido sobre NSURConexión
y NSOperation
, que ha demostrado ser una combinación potente y elegante. El resultado de esta combinación es AFURLConnectionOperation
, un NSOperation
subclase que gestiona una NSURConexión
instancia e implementa el NSURLConnectionDelegate
protocolo. A pesar de que esta base sólida permanece sin cambios en AFNetworking 2.0, se complementa con el SESIÓN
API, que voy a cubrir con más detalle más adelante.
En AFNetworking 1.x, el AFHTTPRequestOperation
La clase estuvo a cargo de la solicitud y respuesta de serialización y validación. Esto ya no es cierto en AFNetworking 2.0. los AFHTTPRequestOperation
clase y sus subclases ya no son directamente Responsable de serializar y validar solicitudes y respuestas. Esta responsabilidad ha sido trasladada a la AFURLRequestSerialization
y AFURLResponseSerialización
protocolos Cada protocolo declara un solo método de delegado para manejar la serialización y validación de solicitudes y respuestas respectivamente.
Sin embargo, para hacer su vida más fácil, AFNetworking 2.0 viene con AFHTTPRequestSerializer
y AFHTTPResponseSerializer
así como varias subclases para tipos de contenido comunes, como JSON y XML. Para ver cómo funciona esto en la práctica, echemos un vistazo a un ejemplo en el que solicito la API de pronóstico. Esto no se ve muy diferente de cómo realizó una solicitud con AFNetworking 1.x. La principal diferencia es que estarás usando el AFHTTPRequestOperation
clase más a menudo. los AFJSONRequestOperation
y AFXMLRequestOperation
Las clases ya no están presentes en AFNetworking 2.0.
NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", clave]]; // Inicializar la operación de solicitud AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Configurar la operación de solicitud [requestOperation setResponseSerializer: [AFJSONResponseSerializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (AFHTTPRequestOperation * operation, id responseObject) // Process Process Object failure: ^ (AFHTTPRequestOperation * operation, NSError * error) // Handle Error]; // Iniciar solicitud de operación [requestOperation start];
los AFJSONResponseSerializer
clase hereda de AFHTTPResponseSerializer
y debe usarse para respuestas JSON. Si necesita procesar respuestas XML, entonces AFXMLNResponseSerializer
te ayudará Para otros tipos de contenido, necesita subclase AFHTTPResponseSerializer
.
AFHTTPRequestOperationManager
Otro cambio importante en AFNetworking 2.0 es la eliminación de la AFHTTPClient
Clase, que se encargaba de hablar con los servicios web. Las responsabilidades de AFHTTPClient
Se han dividido en una serie de clases y protocolos. Para hablar con un servicio web, ahora usas AFHTTPRequestOperationManager
y AFHTTPSessionManager
. Al igual que AFHTTPRequestOperation
, AFHTTPRequestOperationManager
y AFHTTPSessionManager
Delegar la serialización de solicitudes y respuestas a objetos separados. Ambos AFHTTPRequestOperationManager
y AFHTTPSessionManager
tener un requestSerializer
y responseSerializer
Propiedad para este fin. Revisemos el ejemplo anterior para ver cómo funciona esto en la práctica..
NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/", clave]]; // Inicializar el Administrador de operaciones de solicitud AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: baseURL]; // Configurar Request Operation Manager [administrador setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Enviar solicitud [administrador GET: @ "37.8267, -122.423" parámetros: éxito nulo: ^ (operación AFHTTPRequestOperation *, id responseObject) // Process Process Object error: ^ (operación AFHTTPRequestOperation *, NSError * error) / / Manejar error];
SESIÓN
?AFURLSessionManager
La pregunta clave a la hora de discutir AFNetworking 2.0 a la luz del SESIÓN
API es si todavía necesitamos AFNetworking. AFNetworking agrega una serie de clases y métodos de conveniencia a la SESIÓN
API y esto solo es posible gracias a la separación de responsabilidades que mencioné anteriormente. La mejora más significativa que proporciona AFNetworking en la parte superior de la SESIÓN
API son los AFURLSessionManager
y AFHTTPSessionManager
clases.
los AFURLSessionManager
te ayuda a manejar un SESIÓN
objeto. Aunque me encanta la SESIÓN
API, estoy de acuerdo con Mattt en que su API está incompleta. los AFURLSessionManager
clase agrega una serie de métodos de conveniencia que hacen que el SESIÓN
API incluso mejor. La serialización y la validación, por ejemplo, son mucho más fáciles e intuitivas con AFNetworking. Al igual que el AFHTTPRequestOperationManager
, instancias de AFURLSessionManager
tener un requestSerializer
y responseSerializer
Propiedad que hace que la serialización de solicitudes y respuestas sea transparente e intuitiva..
NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", clave]]; // Inicializar configuración de sesión NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Inicializar Session Manager AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration: sessionConfiguration]; // Configure Manager [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Enviar solicitud NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[manager dataTaskWithRequest: solicitud de finalizaciónHandler: ^ (NSURLResponse * response, id responseObject, NSError * error) // Process Response Object] resume];
Espero que pueda ver el beneficio de usar AFNetworking en combinación con el SESIÓN
API. Hace trabajar con el SESIÓN
API mucho más intuitivo, especialmente si ya está acostumbrado a la forma en que AFNetworking 2.0 separa la serialización y la validación de la tarea real o la operación de solicitud.
AFHTTPSessionManager
AFNetworking 2.0 también incluye una subclase de AFURLSessionManager
, AFHTTPSessionManager
, lo que hace que la interacción con los servicios web sea muy fácil. los AFHTTPSessionManager
clase incluye una serie de métodos de conveniencia, tales como GET: parámetros: éxito: fracaso
y POST: parámetros: constructingBodyWithBlock: éxito: error:
que hacen que el proceso de migración de AFHTTPClient
a AFHTTPSessionManager
fácil. Métodos similares también están disponibles en el AFHTTPRequestOperationManager
clase, que he discutido anteriormente.
El alcance es manejado por el AFURLRequestOperationManager
y AFURLSessionManager
clases Cuando las instancias de estas clases tengan una validez. baseURL
, luego, se crea automáticamente una instancia y se configura un administrador de accesibilidad. Por supuesto, también es posible crear explícitamente una instancia de AFNetworkReachabilityManager
clase.
AFNetworking 2.0 tiene una serie de otras características, como el soporte incorporado para la fijación de SSL y varias categorías en las clases de UIKit. Eche un vistazo a este ejemplo en el que aprovecho la categoría de AFNetworking en UIProgressView
para actualizar una vista de progreso mientras se descarga una imagen remota.
// Inicializar solicitud NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Inicializar Session Manager self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Inicializar la tarea de descarga NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: progreso de la solicitud: nil destino: ^ NSURL * (NSURL * targetPath, NSURLResponse * respuesta) // Handle Success completeHandler: ^ (NSURLResponse * Respuesta, NSL *) , NSError * error) // Manejar falla]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask animated: YES]; [descargar currículum de la tarea];
Si su proyecto no depende de la red, no necesitará toda la potencia y la comodidad que AFNetworking tiene para ofrecer. De hecho, creo que es importante que todos los desarrolladores de iOS o OS X estén familiarizados con SESIÓN
y NSURConexión
, Porque son componentes clave de la plataforma..
A pesar de SESIÓN
La API es excelente y fácil de usar, las API de red proporcionadas por el marco de Foundation no son perfectas. Como señala Mattt, incluso el SESIÓN
API tiene algunas lagunas notables. AFNetworking trata de llenar elegantemente estas lagunas. La combinación de los SESIÓN
API y AFNetworking es un matrimonio hecho en el cielo. Verdaderamente es una alegría usar.
Me gusta mucho el SESIÓN
API y espero haberte convencido de su poder en esta serie. Sin embargo, esto no significa que AFNetworking se haya vuelto obsoleto. En mi opinión, AFNetworking es el compañero perfecto del SESIÓN
API. AFNetworking ha madurado y, de hecho, es la mejor y más robusta biblioteca de redes disponible. Su arquitectura modular significa que no necesita incluir cada clase o categoría que ofrece. Usted es libre de elegir y elegir los componentes que incluye. AFNetworking es compatible con las subespecies CocoaPods, lo que hace que este proceso sea trivial..
No podría estar más feliz con el segundo lanzamiento importante de AFNetworking. La modularidad y la separación de responsabilidades de la biblioteca es lo que la hace brillar en mi opinión. Complementa la SESIÓN
API tan bien que ni siquiera notará que está utilizando AFNetworking. Mattt Thompson y los más de 130 colaboradores de AFNetworking han hecho un trabajo formidable. Es bueno ser un desarrollador de cacao..