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..
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.
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.
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..
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.
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..
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:
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.
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;
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.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.
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'écranblagues
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.
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?
[JokeModel arrayOfModelsFromData: erreur:]
prend les données JSON et les transforme en un tableau d'objets JSON.JokeModel
des boucles sur ces objets et crée JokeModel
instances de chaque objet JSON.JokeModel
instance inspecte les données JSON reçues et initialise ses propriétés avec les valeurs appropriées.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];);
- (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..
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..
Vous avez maintenant une compréhension de base de la bibliothèque JSONModel. Jusqu'à présent, vous avez appris:
JSONModè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..