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