Débuter avec JSONModel

Qu'est-ce que JSONModel??

La plupart du temps, nos appareils iOS sont connectés à Internet et, naturellement, la plupart des applications de nos appareils se connectent à un serveur distant pour récupérer de temps en temps telle ou telle partie des données..

Certaines applications ne consomment qu'un petit peu de données et ne récupèrent que les dernières actualités toutes les heures environ. D'autres applications interagissent beaucoup avec un service d'arrière-plan pendant que l'utilisateur navigue dans son flux social, lit les publications et télécharge des photos..

Les jours où chaque service Web parlait XML sont révolus. De nos jours, la plupart des applications mobiles communiquent avec des services Web à l'aide de JSON. Si vous envisagez de créer une application mobile qui communique avec un serveur distant, il est probable que vous aurez besoin de pouvoir envoyer et recevoir du JSON..

JSONModel est une bibliothèque open source écrite en Objective-C, qui vous aide à extraire un JSON d'un serveur, à l'analyser et à initialiser vos classes de modèle avec les données. Il valide également les données JSON, les cascades via des modèles imbriqués, etc..

"Mais attendez!" vous pensez peut-être "J'ai déjà écrit une application iPhone qui récupère du JSON et l'affiche à l'écran. C'était assez facile!"

Eh bien, c'est partiellement vrai. NSJSONSérialisation disponible depuis iOS 5, il est donc très facile de convertir une réponse JSON en un NSDictionary objet. Cela fonctionne bien pour des applications simples, mais croyez-moi, ce n'est pas une bonne idée pour une application complexe avec un modèle de données complexe. Voyons comment JSONModel peut sauver votre bacon.

Notez que je suis l'auteur de JSONModel, développant et maintenant la bibliothèque avec l'aide de contributeurs sur GitHub. Je suis évidemment partial, mais c’est une bonne nouvelle pour vous, car vous pourrez apprendre de la personne qui a créé la bibliothèque..

Caractéristiques de base

Dans cette section, je vais brièvement souligner et discuter des fonctionnalités de base de la bibliothèque. Si vous êtes trop pressé de plonger dans le code, passez à la section suivante., L'application Hello Chuck.

Mappage automatique de JSON à des classes de modèle

Lorsque vous examinez les données JSON qui renseignent votre objet de modèle, vous vous sentez souvent enclin à faire correspondre les noms des clés utilisées dans les données JSON. Vous finissez par écrire un code qui ressemble à ceci:

self.firstName = [json objectForKey: @ "prénom"]; self.familyName = [json objectForKey: @ "familyName"]; self.age = [json objectForKey: @ "age"];

Avec JSONModel, vous n'avez pas besoin d'écrire ce type de code standard. JSONModel mappe automatiquement JSON aux propriétés de la classe de modèle.

Validation d'entrée

JSONModel inspecte automatiquement les propriétés de votre classe de modèle et s'assure que le JSON utilisé pour initialiser un objet de modèle correspond à la définition de la classe de modèle. En cas d'incompatibilité, l'objet de modèle ne sera pas initialisé..

En outre, le modèle vérifie que les données JSON correspondent aux types définis par la classe de modèle. Si vous obtenez un tableau au lieu d'une chaîne, par exemple, les données JSON sont considérées comme non valides..

Transformation de données

Grâce à la spécification simple de JSON, il est facile à utiliser, mais il supprime également beaucoup de métadonnées lorsqu'il est utilisé pour transférer des données d'un backend à un client et vice versa. Un objet JSON ne peut contenir que des chaînes, des nombres, des tableaux et des objets.

Dans votre classe de modèle Objective-C, vous avez généralement des propriétés de différents types, non limités aux chaînes et aux nombres, qui sont les seuls types de données pris en charge par JSON. Par exemple, vous avez souvent des URL dans un objet JSON. Il est facile de convertir une chaîne dans un objet JSON en un NSURL objet, mais la partie ennuyante est que vous devez le faire vous-même.

JSONModel vous permet de définir une seule fois les transformations de types de données et de les utiliser dans vos modèles. Par exemple, si une réponse JSON vous fournit une date sous forme d’horodatage sous la forme d’un entier, vous devez uniquement indiquer à JSONModel comment convertir cet entier en un entier. NSDate objet une fois. Vous en apprendrez plus sur les transformations de données dans la deuxième partie de cette série.

Modèles imbriqués

Le plus souvent, une réponse JSON a une structure complexe. Un objet, par exemple, peut contenir un ou plusieurs autres objets. Jetez un coup d'œil à l'objet JSON suivant.

"id": 10, "plus": "texte": "ABC", "compte": 20 

JSONModel vous permet également d'imbriquer des classes de modèle. Que votre modèle contienne un autre modèle ou un tableau d'objet de modèle, JSONModel inspecte les classes de votre modèle et initialise automatiquement les objets du type correct. Nous examinerons de plus près les modèles imbriqués un peu plus tard..

C'est assez de théorie pour l'instant. Apprenons à utiliser la bibliothèque JSONModel en créant un exemple d'application simple..

L'application Hello Chuck

Maintenant que vous avez une idée de base de ce que JSONModel fait, vous allez développer une application simple qui récupère un flux JSON de blagues de Chuck Norris et les montre à l'utilisateur un à un. Lorsque vous avez terminé, l'application ressemblera à ceci:

Étape 1: Configuration du projet

Lancez Xcode 5, créez un nouveau projet en sélectionnant Nouveau> Projet… du Fichier menu et sélectionnez le Application à vue unique modèle de la liste des Application iOS des modèles.

Nommez le projet Bonjour, Indiquez à Xcode où vous souhaitez l'enregistrer et appuyez sur Créer. Il n'est pas nécessaire de placer le projet sous contrôle de source.

Ensuite, téléchargez la dernière version de la bibliothèque JSONModel à partir de GitHub, décompressez l'archive et affichez un pic à l'intérieur..

L'archive contient des applications de démonstration pour iOS et OSX, des tests unitaires, etc. Vous êtes uniquement intéressé par le dossier nommé JSONModèle. Faites-le glisser dans votre projet Xcode. L'installation est encore plus facile si vous utilisez CocoaPods.

Étape 2: Créer des classes de modèle

Le flux JSON que vous allez utiliser est assez simple. Il contient un tableau de blagues, chaque blague ayant un identifiant, la blague elle-même et, éventuellement, un tableau de balises.

"id": 7, "text": "Il y avait une rue qui portait le nom de Chuck Norris, mais elle a été modifiée car personne ne le croise et vit", "tags": ["id": 1, "tag" : "lethal", "id": 2, "tag": "new"]

Commençons par créer les classes de modèle correspondant aux données JSON. Créer une nouvelle classe, JokeModel, et le faire hériter de JSONModèle. Ajouter identifiant et texte propriétés pour correspondre aux clés dans les données JSON comme suit:

@interface JokeModel: JSONModel @property (assign, nonatomic) int id; @property (strong, nonatomic) NSString * text; @fin

La bibliothèque JSONModel convertira automatiquement les nombres en fonction du type de la propriété..

Vous devez également créer une classe pour les objets de balise dans les données JSON. Créer une nouvelle classe, TagModel, et le faire hériter JSONModèle. Déclarer deux propriétés identifiant et étiquette de type NSString. le TagModel la classe devrait ressembler à ceci:

@interface TagModel: JSONModel @property (strong, nonatomic) NSString * id; @property (strong, nonatomic) NSString * tag; @fin

Notez que vous avez défini le type de identifiant à NSString. JSONModel sait parfaitement comment transformer des nombres en chaînes, il gérera la transformation pour vous. L'idée est que vous devez uniquement vous concentrer sur les données dont vous avez besoin dans votre application sans avoir à vous soucier de l'aspect des données JSON..

Même si le TagModel classe est prête à être utilisée, vous avez besoin d’un moyen de JokeModel classe que la clé Mots clés contient une liste de TagModel les instances. C'est très facile à faire avec JSONModel. Ajouter un nouveau protocole vide dans TagModel.h et l'appelle TagModel:

@protocol TagModel @end

Ouvrir JokeModel.h et importer le fichier d'en-tête du TagModel classe:

#import "TagModel.h"

Voici la magie. Déclarer une nouvelle propriété à JokeModel comme indiqué ci-dessous. le Mots clés propriété est de type NSArray et il est conforme à deux protocoles.

@property (strong, nonatomic) NSArray* Mots clés;
  1. TagModel est le protocole que vous avez déclaré il y a un instant. Il raconte JokeModel que le tableau de balises doit contenir des instances du TagModel classe.
  2. En adhérant à la Optionnel protocole, le JokeModel la classe sait que les données JSON ne contiendront pas toujours une liste de balises.

C’est un bon moment pour souligner que chaque propriété de votre classe de modèle est par défaut Champs obligatoires. Si identifiant ou texte sont manquants dans les données JSON, l’initialisation du JokeModel l'objet échouera. Toutefois, si Mots clés sont absents pour une blague, JSONModel ne s'en plaindra pas.

Étape 3: Afficher la configuration du contrôleur

Vous devez d’abord faire quelques ajustements à la ViewController classe. S'ouvrir ViewController.m et, en dessous de la déclaration d'importation existante en haut, importez le JokeModel classe:

#import "JokeModel.h"

Vous devez ajouter deux propriétés à la classe ViewController:

  • étiquette afficher le texte de la blague à l'écran
  • blagues pour stocker le tableau de blagues
@interface ViewController () @property (strong, nonatomic) UILabel * label; @property (strong, nonatomic) Blagues NSArray *; @fin

Vous devez également configurer l’étiquette afin qu’elle soit prête chaque fois que vous récupérez les données JSON et qu’une blague est prête à être affichée. Mettre à jour le viewDidLoad méthode comme indiqué ci-dessous.

- (void) viewDidLoad [super viewDidLoad]; self.label = [[UILabel alloc]] initWithFrame: self.view.bounds]; self.label.numberOfLines = 0; self.label.textAlignment = NSTextAlignmentCenter; self.label.alpha = 0; [self.view addSubview: self.label]; [self fetchJokes]; 

Vous créez un UILabel par exemple la taille de l'écran de l'appareil et vous définissez c'est alpha propriété à 0. L'étiquette est cachée jusqu'à ce que la première blague soit prête à être affichée..

Dans la dernière ligne de viewDidLoad, tu appelles fetchJokes, dans lequel l'application récupère les données JSON distantes et stocke son contenu dans le contrôleur de vue blagues propriété. Vous allez mettre en œuvre fetchJokes dans un instant.

Étape 4: Extraire JSON et créer des objets de modèle

Dans cet exemple, vous utiliserez le NSURLSession classe pour récupérer les données JSON distantes. Vous créez l'URL de la demande, initialisez une tâche de données et envoyez-la ensuite.

- (void) fetchJokes NSURL * jokesUrl = [NSURL URLWithString: @ "https://s3.amazonaws.com/com.tuts.mobile/jokes.json"]; [[[[NSURLSession sharedSession]] dataTaskWithURL: jokesUrl completionHandler: ^ (données NSData *, réponse NSURLResponse *, erreur NSError *) // traiter les données ici]]];  

dataTaskWithURL: completionHandler: crée pour NSURLSessionDataTask exemple avec l’URL qui lui est transmise. En appelant CV sur la tâche de données, vous dites au NSURLSession instance pour ajouter la tâche de données à sa file d'attente.

Ensuite, vous devez ajouter le code pour initialiser le JokeModel les instances. Remplacer // manipule les données ici avec:

self.jokes = [JokeModel arrayOfModelsFromData: erreur de données: nil];

arrayOfModelsFromData: erreur: prend un NSData objet à partir d'une réponse JSON et retourne un tableau de modèles. Mais qu'est-ce qui se passe sous le capot?

  1. [JokeModel arrayOfModelsFromData: erreur:] prend les données JSON et les transforme en un tableau d'objets JSON.
  2. ensuite JokeModel des boucles sur ces objets et crée JokeModel instances de chaque objet JSON.
  3. Chaque JokeModel instance inspecte les données JSON reçues et initialise ses propriétés avec les valeurs appropriées.
  4. Si la JokeModel instance trouve le contenu dans les données Mots clés clé, alors il crée un tableau de TagModel instances de la valeur associée à la Mots clés clé.

Si vous n'avez besoin que de créer une instance de modèle, alors initWithData: et initWithString: sont les méthodes que vous devez utiliser. Nous examinerons de plus près ces méthodes dans le prochain tutoriel..

Après avoir initialisé le tableau de blagues, vous pouvez afficher la première blague à l'utilisateur à l'aide de l'extrait de code suivant..

dispatch_async (dispatch_get_main_queue (), ^ [self showNextJoke];);

Étape 5: Afficher des blagues

- (void) showNextJoke JokeModel * model = self.jokes [arc4random ()% self.jokes.count]; NSString * tags = model.tags? [Model.tags componentsJoinedByString: @ ","]: @ "pas de tags"; self.label.text = [NSString stringWithFormat: @ "% i.% @ \ n \ n% @", model.id, model.text, tags]; [UIView animateWithDuration: 1.0 animations: ^ self.label.alpha = 1.0;  complétion: ^ (BOOL terminé) [self performSelector: @selector (hideJoke) withObject: nil afterDelay: 5.0]; ]; 

Vous tirez d'abord une blague au hasard de la blagues tableau et le stocker dans modèle. Si la blague a des tags, vous les stockez sous forme de liste séparée par des virgules dans une variable nommée Mots clés. Si la blague n'a pas de balises, vous définissez Mots clés à @ "pas de tags".

Vous mettez à jour l'étiquette pour afficher le identifiant, texte, et Mots clés de la blague actuelle et utiliser une animation de fondu pour montrer la blague à l'utilisateur.

Lorsque l'animation est terminée, vous attendez cinq secondes avant d'appeler hideJoke, qui cache la blague avec une autre animation en fondu. Lorsque l'animation est terminée, vous appelez showNextJoke encore une fois.

- (void) hideJoke [UIView animateWithDuration: 1.0 animations: ^ self.label.alpha = 0.0;  complétion: ^ (BOOL terminé) [self showNextJoke]; ]; 

Cela crée une boucle infinie, atténuant les blagues sélectionnées de manière aléatoire. L'effet est plutôt cool. Essayez-le en exécutant l'application.

Cependant, le problème qui se pose lors de l’impression du tableau de tags TagModel objets au lieu d'objets de chaîne. Ce comportement est en fait une fonctionnalité de la bibliothèque JSONModel. Il crée automatiquement une description de l'objet comme celle que vous avez vue dans la capture d'écran précédente. Il répertorie les propriétés de l'objet de modèle et leurs valeurs, ce qui facilite grandement le débogage..

Étape 6: Personnalisation des modèles

Pour terminer ce didacticiel, vous allez écrire votre première ligne de code de modèle. Des modèles qui héritent de JSONModèle sont comme n'importe quelle autre classe Objective-C. Cela signifie que vous pouvez remplacer les méthodes de JSONModèle et personnaliser leur comportement comme bon vous semble.

Ouvrir TagModèle.m et substituer la méthode de description par défaut:

- (NSString *) description return self.tag; 

Quand vous appelez maintenant composantsJoinedBySeparator: sur le tableau de balises, au lieu de la description par défaut de TagModel vous obtiendrez simplement la balise en texte brut.

Essayez-le en exécutant l'application une fois de plus. Vous devriez maintenant voir la liste des tags apparaître sous chaque blague..

Conclusion

Vous avez maintenant une compréhension de base de la bibliothèque JSONModel. Jusqu'à présent, vous avez appris:

  • comment créer une classe de modèle simple qui hérite de JSONModèle
  • comment définir les propriétés obligatoires et facultatives
  • et comment imbriquer des classes de modèle

Dans ce court tutoriel, je n’ai abordé que quelques-unes des fonctionnalités du JSONModèle bibliothèque. Dans les prochains épisodes de cette série, vous en apprendrez plus sur la transformation de données, sur l'utilisation d'API JSON distantes, et sur des fonctionnalités plus avancées de JSONModel..