Travailler avec NSURLSession AFNetworking 2.0

Dans les épisodes précédents de cette série, nous avons examiné de près le NSURLSession API introduite dans iOS 7 et OS X Mavericks. La mise en réseau sur iOS et OS X est devenue beaucoup plus simple et plus flexible grâce au NSURLSession API. Cela signifie-t-il que vous devriez cesser d'utiliser AFNetworking pour vos besoins en réseau? Et qu'en est-il d'AFNetworking 2.0, qui a été introduit il y a quelques mois? Dans cette dernière tranche, je vais vous parler d’AFNetworking 2.0 et de la façon dont il se compare à la NSURLSession API.


introduction

Comme le souligne Mattt Thompson sur NSHipster, AFNetworking est devenue la bibliothèque de réseau de facto pour les applications Cocoa. Au moment de la rédaction de cet article, la bibliothèque a dépassé les 10 000 étoiles sur GitHub et a été fourchue près de 3 000 fois..

Si vous êtes nouveau sur AFNetworking et que vous souhaitez en savoir plus sur son histoire et ses fonctionnalités, je vous suggère de lire le message de Mattt sur AFNetworking 2.0 sur NSHipster. Dans cet article, je voudrais aborder deux aspects: les nouveautés d’AFNetworking 2.0 et leur comparaison avec le NSURLSession API. La question que vous devriez vous poser est "Dois-je toujours utiliser AFNetworking avec NSURLSession dans ma boîte à outils? "Voilà la question à laquelle je souhaite répondre dans cet article.


Exigences

Avant d'examiner de plus près ce que AFNetworking 2.0 peut offrir, il est important de connaître les nouvelles exigences de la bibliothèque. Il n’est pas surprenant que les exigences d’AFNetworking 2.0 soient plus strictes que celles d’AFNetworking 1.x. Comme son numéro de version l'indique, AFNetworking inclut des modifications importantes, qui résultent de sa nouvelle architecture. Cela signifie également que la migration d'un projet d'AFNetworking 1.x vers la version 2.0 doit être effectuée avec prudence. Le guide de migration est le point de départ idéal si vous envisagez de migrer un projet vers AFNetworking 2.0..

AFNetworking ne prend plus en charge les versions iOS 4.3 et 5. Les cibles de déploiement minimales pour iOS et OS X sont respectivement iOS 6 et OS X 10.8. AFNetworking 2.0 requiert également Xcode 5. Si vous utilisez toujours Xcode 4, le moment est peut-être bien choisi pour passer à Xcode 5..


Fondation solide

AFURLConnectionOperation

Comme beaucoup d’entre vous le savent probablement, AFNetworking s’appuie sur NSURLConnection et NSOperation, qui s'est avéré être une combinaison puissante et élégante. Le résultat de cette combinaison est AFURLConnectionOperation, un NSOperation sous-classe qui gère un NSURLConnection exemple et met en œuvre le NSURLConnectionDelegate protocole. Bien que cette base solide reste inchangée dans AFNetworking 2.0, elle est complétée par la NSURLSession API, que je couvrirai plus en détail plus tard.

Séparation des responsabilités

Dans AFNetworking 1.x, le AFHTTPRequestOperation La classe était chargée de la sérialisation et de la validation des demandes et des réponses. Ce n'est plus vrai dans AFNetworking 2.0. le AFHTTPRequestOperation classe et ses sous-classes ne sont plus directement responsable de la sérialisation et de la validation des demandes et des réponses. Cette responsabilité a été déplacée vers le AFURLRequestSerialization et AFURLResponseSerialization protocoles. Chaque protocole déclare une seule méthode déléguée pour gérer respectivement la sérialisation et la validation des demandes et des réponses..

Cependant, pour vous simplifier la vie, AFNetworking 2.0 est livré avec AFHTTPRequestSerializer et AFHTTPResponseSerializer ainsi qu'un certain nombre de sous-classes pour les types de contenu courants, tels que JSON et XML. Pour voir comment cela fonctionne dans la pratique, examinons un exemple dans lequel j'interroge l'API Forecast. Cela ne semble pas si différent de la manière dont vous avez fait une demande avec AFNetworking 1.x. La principale différence est que vous utiliserez le AFHTTPRequestOperation classe plus souvent. le AFJSONRequestOperation et AFXMLRequestOperation les classes ne sont plus présentes dans AFNetworking 2.0.

 NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", clé]]; // Opération d'initialisation de demande AFHTTPRequestOperation * requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest: [NSURLRequest requestWithURL: URL]]; // Configurer l'opération de demande [requestOperation setResponseSerializer: [AFJSONResponseSerializer serializer]]; [requestOperation setCompletionBlockWithSuccess: ^ (opération AFHTTPRequestOperation *, id responseObject) // Process Response Object échec: ^ (opération AFHTTPRequestOperation *, erreur NSError *) // Erreur de traitement]; // Démarrer l'opération de demande [requestOperation start];

le AFJSONResponseSerializer la classe hérite de AFHTTPResponseSerializer et devrait être utilisé pour les réponses JSON. Si vous devez traiter des réponses XML, alors AFXMLNResponseSerializer va vous aider. Pour les autres types de contenu, vous devez sous-classer AFHTTPResponseSerializer.

AFHTTPRequestOperationManager

Un autre changement majeur dans AFNetworking 2.0 est la suppression de la AFHTTPClient classe, qui était en charge de parler aux services Web. Les responsabilités de AFHTTPClient ont été divisés en un certain nombre de classes et de protocoles. Pour parler à un service Web, vous utilisez maintenant AFHTTPRequestOperationManager et AFHTTPSessionManager. Juste comme AFHTTPRequestOperation, AFHTTPRequestOperationManager et AFHTTPSessionManager déléguer la sérialisation des demandes et des réponses à des objets distincts. Tous les deux AFHTTPRequestOperationManager et AFHTTPSessionManager avoir un requestSerializer et responseSerializer propriété à cet effet. Reprenons l'exemple ci-dessus pour voir comment cela fonctionne dans la pratique.

 NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * baseURL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/, key]]; // Initialize Request Operation Manager AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: baseURL]; // Configurer Request Operation Manager [gestionnaire setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Send Request [manager GET: @ "37.8267, -122.423" paramètres: aucune réussite: ^ (opération AFHTTPRequestOperation *, id responseObject) // Objet Réponse de processus: ^ (opération AFHTTPRequestOperation *, erreur NSError *) / / Erreur de poignée];

Qu'en est-il de NSURLSession?

AFURLSessionManager

La question clé lors de la discussion d’AFNetworking 2.0 à la lumière de la NSURLSession L'API consiste à savoir si nous avons encore besoin d'AFNetworking. AFNetworking ajoute un certain nombre de classes et de méthodes pratiques à la NSURLSession API et cela n’est possible que grâce à la séparation des responsabilités dont j’ai déjà parlé. L’amélioration la plus importante apportée par AFNetworking en plus de la NSURLSession Les API sont les AFURLSessionManager et AFHTTPSessionManager Des classes.

le AFURLSessionManager vous aide à gérer un NSURLSession objet. Même si j'aime le NSURLSession API, je suis d’accord avec Mattt pour dire que son API est incomplète. le AFURLSessionManager classe ajoute un certain nombre de méthodes pratiques qui rendent le NSURLSession API encore mieux. La sérialisation et la validation, par exemple, sont beaucoup plus simples et intuitives avec AFNetworking. Comme le AFHTTPRequestOperationManager, des exemples de AFURLSessionManager avoir un requestSerializer et responseSerializer propriété qui rend la sérialisation des demandes et des réponses transparente et intuitive.

 NSString * key = @ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSURL * URL = [NSURL URLWithString: [NSString stringWithFormat: @ "https://api.forecast.io/forecast/%@/37.8267,-122.423", clé]]; // Initialisation de la configuration de session NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // Initialisation de Session Manager AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration: sessionConfiguration]; // Configurer le gestionnaire [manager setResponseSerializer: [AFJSONResponseSerializer serializer]]; // Envoi de la requête NSURLRequest * request = [NSURLRequest requestWithURL: URL]; [[manager dataTaskWithRequest: request completionHandler: ^ (réponse NSURLResponse *, id idObjet, erreur NSError *) // objet de réponse de processus] resume];

J'espère que vous pourrez voir l'intérêt d'utiliser AFNetworking en combinaison avec le NSURLSession API. Ça fait travailler avec le NSURLSession API beaucoup plus intuitive, surtout si vous êtes déjà habitué à la façon dont AFNetworking 2.0 sépare la sérialisation et la validation de la tâche ou de l'opération de demande réelle.

AFHTTPSessionManager

AFNetworking 2.0 comprend également une sous-classe de AFURLSessionManager, AFHTTPSessionManager, ce qui facilite l'interaction avec les services Web. le AFHTTPSessionManager classe comprend un certain nombre de méthodes de commodités, telles que GET: paramètres: succès: échec: et POST: paramètres: constructingBodyWithBlock: success: failure: qui rendent le processus de migration de AFHTTPClient à AFHTTPSessionManager facile. Des méthodes similaires sont également disponibles dans le AFHTTPRequestOperationManager classe, dont j'ai parlé plus tôt.


Accessibilité

L'accessibilité est gérée par le AFURLRequestOperationManager et AFURLSessionManager Des classes. Lorsque les instances de ces classes ont une valeur valide baseURL, un gestionnaire d'accessibilité est alors automatiquement instancié et configuré. Bien entendu, il est également possible de créer explicitement une instance du AFNetworkReachabilityManager classe.


Glaçage sur le gateau

AFNetworking 2.0 comporte un certain nombre d'autres fonctionnalités, telles que la prise en charge intégrée du repérage SSL et diverses catégories sur les classes UIKit. Regardez cet exemple dans lequel je tire parti de la catégorie d’AFNetworking sur UIProgressView mettre à jour une vue de progression lors du téléchargement d'une image distante.

 // Initialize Request NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://cdn.tutsplus.com/mobile/uploads/2014/01/5a3f1-sample.jpg"]]; // Initialisation du gestionnaire de session self.sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]]; // Initialize Download Task NSURLSessionDownloadTask * downloadTask = [self.sessionManager downloadTaskWithRequest: progression de la demande: nil destination: ^ NSURL * (NSURL * targetPath, NSURLResponse * response) // Réussite de la requête completionHandler: ^ (NSURLResponse * response, NSURL * filePath , NSError * error) // Handle Failure]; [self.progressView setProgressWithDownloadProgressOfTask: downloadTask animated: YES]; [télécharger le CV de la tâche];

Verdict

Si votre projet ne repose pas sur la mise en réseau, vous n’avez pas besoin de toute la puissance et de la commodité offertes par AFNetworking. En fait, je pense qu’il est important que tous les développeurs iOS ou OS X soient familiarisés avec NSURLSession et NSURLConnection, parce qu'ils sont des composants clés de la plate-forme.

Même si le NSURLSession L'API est géniale et facile à utiliser, les API de réseau fournies par le framework Foundation ne sont pas parfaites. Comme le souligne Mattt, même le NSURLSession L'API présente quelques lacunes notables. AFNetworking tente de combler ces lacunes avec élégance. La combinaison de la NSURLSession API et AFNetworking est un mariage paradisiaque. C'est vraiment une joie d'utiliser.

J'aime beaucoup le NSURLSession API et j'espère vous avoir convaincu de sa puissance dans cette série. Toutefois, cela ne signifie pas qu'AFNetworking est devenu obsolète. À mon avis, AFNetworking est le compagnon idéal de la NSURLSession API. AFNetworking a mûri et c'est en effet la meilleure et la plus robuste bibliothèque de réseaux disponible. Son architecture modulaire signifie que vous n'avez pas besoin d'inclure toutes les classes ou catégories proposées. Vous êtes libre de choisir parmi les composants inclus. AFNetworking prend en charge les sous-spécifications CocoaPods, ce qui rend ce processus trivial..


Conclusion

Je ne pourrais être plus satisfait de la deuxième version majeure d’AFNetworking. La modularité et la séparation des responsabilités de la bibliothèque sont ce qui la fait briller à mon avis. Il complète le NSURLSession API si bien que vous ne remarquerez même pas que vous utilisez AFNetworking. Mattt Thompson et les plus de 130 contributeurs d’AFNetworking ont accompli un travail remarquable. C'est bien d'être un développeur Cocoa.