Au cours de votre carrière dans le développement iOS, vous aurez besoin d'interagir avec un service Web à partir de votre application. Vous devrez peut-être accéder à des données distantes, analyser un flux de réseau social ou même télécharger des actifs dans votre application. Cette astuce vous apprendra à le faire sans utiliser de bibliothèques tierces!
Il existe d'incroyables bibliothèques tierces sur le marché facilitant les interactions de services Web, notamment ASIHTTPRequest, AFNetworking et RESTKit. Bien que ces bibliothèques soient incroyablement utiles, elles sont parfois un peu excessives. Ils ajoutent un peu de code inutile à une application via des variables supplémentaires en mémoire, et modifient également votre flux de travail pour l'adapter au flux de travail de chaque bibliothèque..
J'avais l'habitude d'utiliser certaines de ces bibliothèques (et plus!) Comme une béquille. Je pensais que leur utilisation accélérait le développement et réduisait la complexité. Bien que cela soit vrai dans de nombreux cas, ce ne sont pas des solutions uniques. De plus, vous ajoutez de la complexité à moins de tout comprendre sous le capot de ces bibliothèques..
Aujourd'hui, je vais vous montrer une approche beaucoup plus simple pour interfacer avec des services Web et télécharger des données à partir du Web. J'ai récemment utilisé cette approche dans mon nouveau client iOS MUD, Pocket MUD Pro, pour extraire l'audio, les paramètres et les données distants. Cette approche implique l’utilisation des technologies «intégrées» pour le téléchargement, l’analyse et l’utilisation de JSON distant, ainsi que d’actifs tels que des images et des sons..
Dans les versions iOS antérieures à 4, il était très difficile d'extraire les données de manière asynchrone. Vous deviez généralement créer une classe complète dédiée à la création de requêtes, puis une autre pour analyser et utiliser les réponses. Avec Grand Central Dispatch (GCD), vous pouvez maintenant le faire en ligne et garder votre code court et propre. Ici, vous verrez du code qui récupère un document JSON distant sur le Web:
dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async (file d'attente, ^ NSError * error = nil; NSURL * url = [NSURL URLWithString: @ "http://brandontreb.com/apps/pocket-mud-pro/promo.json"]; NSString * json = [NSString stringWithContentsOfURL: encodage d'URL: erreur NSASCIIStringEncoding: & error]; NSLog (@ "\ nJSON:% @ \ n erreur:% @", json, error););
Ce code commence par récupérer l'une des trois files d'attente de dispatch d'Apple que vous pouvez utiliser pour une exécution asynchrone et exécute un bloc avec une priorité par défaut. Vous auriez tout aussi bien pu créer votre propre file d'attente. Quoi qu'il en soit, cela permet à notre code de s'exécuter dans un thread distinct du thread principal, grâce à la puissance de Grand Central Dispatch (GCD)..
Nous construisons ensuite l'URL et la collons dans le stringWithContentsOfURL: encoding: error:
méthode de NSString pour récupérer les données JSON. Enfin, la chaîne de retour est imprimée avec l'erreur (s'il y en a une).
Cette approche est très rapide, mais ne vous donne pas une tonne de contrôle. Bien que vous sachiez quelle erreur pourrait être, cela ne vous permet pas de spécifier un délai d'expiration en cas d'erreur. Le délai d'attente par défaut est d'environ 30 secondes. Si vous souhaitez un contrôle supplémentaire sur le délai d’expiration, remplacez la méthode string par un NSURLConnection..
Depuis iOS 5, Apple dispose d'un analyseur JSON intégré qui vous permet de convertir une chaîne contenant JSON en un fichier NSDictionary ou NSArray. Pour analyser et utiliser le code JSON renvoyé dans le code ci-dessus, ajoutez ces lignes avant la fin du bloc:
if (! erreur) NSData * jsonData = [json dataUsingEncoding: NSASCIIStringEncoding]; NSDictionary * jsonDict = [NSJSONSerialization JSONObjectWithData: options jsonData: erreur kNilOptions: & error]; NSLog (@ "JSON:% @", jsonDict);
le NSJSONSérialisation
class analysera et convertira une chaîne JSON en un NSDictionary ou un NSArray en fonction du format de votre JSON. Cela rend la vie beaucoup plus facile. Vous pouvez maintenant utiliser les valeurs de la chaîne JSON comme ceci:
NSString * promo_url = [jsonDict objectForKey: @ "promo_url"];
Et voila! Un moyen très simple de consommer des services Web en utilisant UNIQUEMENT des classes de SDK natives. Passons maintenant à quelque chose d'un peu plus intéressant… des images!
Nous pouvons utiliser la méthode décrite ci-dessus pour récupérer tout type de support distant. Pour cet exemple, je vais vous montrer comment télécharger une image du blog XKCD.
dispatch_queue_t img_queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async (img_queue, ^ NSURL * url = [NSURL URLWithString: @ "http://imgs.xkcd.com/comics/formal_logic.png"]; NSError * erreur = aucune; NSData * image = [NSData dataWithContentsOfURL: options : 0 erreur: & error]; if (! Erreur && image && [longueur de l'image]> 0) NSArray * chemins = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES); NSString * chemin = [[chemins objectAtIndex: 0] image.png "]; [image writeToFile: options de chemin: 0 erreur: & erreur];
Encore une fois, nous commençons par obtenir une file d’exécution asynchrone. Ensuite, nous récupérons les données d’image en utilisant le dataWithContentsOfURL: options: erreur:
méthode de NSData. Une fois que nous avons vérifié que nous avons renvoyé certaines données, nous saisissons une référence au répertoire caches sur le disque et enregistrons l'image..
Et c'est aussi simple que cela! Vous pouvez également utiliser immédiatement l'image récupérée en procédant comme suit:
UIImage * img = [UIImage imageWithData: image];
J'espère que cet article vous a aidé à supprimer votre béquille sur les bibliothèques tierces afin d'interagir avec le Web. Vous devriez maintenant avoir les connaissances nécessaires pour créer une application Web complète. Si vous avez des questions ou des commentaires, laissez-les ici ou écrivez-moi sur Twitter.
Code heureux!