Trabajar con NSURLSession AFNetworking 2.0

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.


Introducción

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.


Requerimientos

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.


Fundacion solida

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.

Separación de responsabilidades

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

Qué pasa 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.


Alcance

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.


Formación de hielo en la torta

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

Veredicto

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


Conclusión

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