Erste Schritte mit JSONModel

Was ist JSONModel??

Unsere iOS-Geräte sind meistens mit dem Internet verbunden, und natürlich verbinden sich die meisten Apps auf unseren Geräten mit einem Remote-Server, um immer wieder dieses oder jenes Datenstück zu greifen.

Einige Apps verbrauchen nur ein wenig Daten und rufen nur jede Stunde die neuesten Schlagzeilen ab. Andere Apps interagieren häufig mit einem Back-End-Service, während der Benutzer seinen sozialen Feed durchsucht, Beiträge durchliest und Fotos hochlädt.

Die Zeiten, in denen jeder Webservice XML sprach, sind lange vorbei. Heutzutage kommunizieren die meisten mobilen Anwendungen über JSON mit Webservices. Wenn Sie vorhaben, eine mobile Anwendung zu erstellen, die mit einem Remote-Backend kommuniziert, besteht die Möglichkeit, dass Sie JSON senden und empfangen müssen.

JSONModel ist eine in Objective-C geschriebene Open Source-Bibliothek, mit der Sie JSON von einem Server abrufen, parsen und Ihre Modellklassen mit den Daten initialisieren können. Es validiert auch die JSON-Daten, kaskadiert durch verschachtelte Modelle und mehr.

"Aber warte!" Sie denken vielleicht "Ich habe bereits eine iPhone-App geschrieben, die JSON abruft und auf dem Bildschirm anzeigt. Das war ziemlich einfach!"

Nun, das stimmt teilweise. NSJSONSerialisierung ist seit iOS 5 verfügbar, es ist also ziemlich einfach, eine JSON-Antwort in eine zu konvertieren NSDictionary Objekt. Dies funktioniert gut für einfache Anwendungen, aber glauben Sie mir, wenn ich sage, dass dies keine gute Idee für eine komplexe Anwendung mit einem komplexen Datenmodell ist. Mal sehen, wie JSONModel Ihren Speck retten kann.

Beachten Sie, dass ich der Autor von JSONModel bin, der die Bibliothek mit Hilfe von Mitwirkenden auf GitHub entwickelt und verwaltet. Ich bin offensichtlich voreingenommen, aber dies ist eine gute Nachricht für Sie, da Sie von der Person lernen können, die die Bibliothek erstellt hat.

Grundfunktionen

In diesem Abschnitt werde ich kurz die grundlegenden Funktionen der Bibliothek hervorheben und besprechen. Wenn Sie zu sehr in Code eintauchen möchten, springen Sie zum nächsten Abschnitt, Die Hallo Chuck App.

Automatische Zuordnung von JSON zu Modellklassen

Wenn Sie sich die JSON-Daten ansehen, die Ihr Modellobjekt auffüllen, neigen Sie oft dazu, mit den Namen der in den JSON-Daten verwendeten Schlüssel übereinzustimmen. Am Ende schreiben Sie Code, der so aussieht:

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

Mit JSONModel müssen Sie diesen Boilerplate-Code nicht schreiben. JSONModel ordnet JSON automatisch den Eigenschaften der Modellklasse zu.

Eingabevalidierung

JSONModel prüft automatisch die Eigenschaften Ihrer Modellklasse und stellt sicher, dass der JSON, der zum Initialisieren eines Modellobjekts verwendet wird, der Modellklassendefinition entspricht. Wenn es keine Übereinstimmung gibt, wird das Modellobjekt nicht initialisiert.

Darüber hinaus stellt das Modell sicher, dass die JSON-Daten den von der Modellklasse definierten Typen entsprechen. Wenn Sie beispielsweise ein Array anstelle einer Zeichenfolge erhalten, werden die JSON-Daten als ungültig betrachtet.

Datenumwandlung

Aufgrund der einfachen Spezifikation von JSON ist es einfach zu verwenden, es werden jedoch auch viele Metadaten entfernt, wenn damit Daten von einem Backend an einen Client und umgekehrt übertragen werden. Ein JSON-Objekt kann nur Zeichenfolgen, Zahlen, Arrays und Objekte enthalten.

In Ihrer Objective-C-Modellklasse verfügen Sie normalerweise über Eigenschaften verschiedener Typen, die nicht auf Zeichenfolgen und Zahlen beschränkt sind. Dies sind die einzigen von JSON unterstützten Datentypen. Beispielsweise haben Sie häufig URLs in einem JSON-Objekt. Eine Zeichenfolge in einem JSON-Objekt kann leicht in eine konvertiert werden NSURL Objekt, aber der nervige Teil ist, dass Sie dies selbst tun müssen.

Mit JSONModel können Sie Transformationen für Datentypen einmal definieren und sie in Ihren Modellen verwenden. Wenn Sie beispielsweise in einer JSON-Antwort ein Datum als Zeitmarke in Form einer Ganzzahl erhalten, müssen Sie JSONModel nur mitteilen, wie die Ganzzahl in eine konvertiert werden soll NSDate Objekt einmal. Im zweiten Teil dieser Serie erfahren Sie mehr über Datentransformationen.

Geschachtelte Modelle

Meistens hat eine JSON-Antwort eine komplexe Struktur. Ein Objekt kann beispielsweise ein oder mehrere andere Objekte enthalten. Schauen Sie sich das folgende JSON-Objekt an.

"id": 10, "more": "text": "ABC", "count": 20 

Mit JSONModel können Sie auch Modellklassen verschachteln. Es spielt keine Rolle, ob Ihr Modell ein anderes Modell oder ein Array von Modellobjekten enthält. JSONModel überprüft Ihre Modellklassen und initialisiert automatisch Objekte des richtigen Typs. Verschachtelte Modelle werden wir später etwas genauer betrachten.

Das ist genug Theorie für jetzt. Erfahren Sie, wie Sie die JSONModel-Bibliothek verwenden, indem Sie eine einfache Beispielanwendung erstellen.

Die Hallo Chuck App

Nachdem Sie nun eine grundlegende Vorstellung davon haben, was JSONModel macht, werden Sie eine einfache App entwickeln, die einen JSON-Feed von Chuck Norris-Witzen abruft und sie dem Benutzer nacheinander anzeigt. Wenn Sie fertig sind, sieht die App etwa so aus:

Schritt 1: Projekt einrichten

Starten Sie Xcode 5, erstellen Sie ein neues Projekt, indem Sie auswählen Neu> Projekt… von dem Datei Menü und wählen Sie die Einzelansicht-Anwendung Vorlage aus der Liste von iOS-Anwendung Vorlagen.

Nennen Sie das Projekt HalloChuck, Sagen Sie Xcode, wo Sie es speichern möchten, und drücken Sie Erstellen. Das Projekt muss nicht unter Quellcodeverwaltung gestellt werden.

Laden Sie als Nächstes die neueste Version der JSONModel-Bibliothek von GitHub herunter, entpacken Sie das Archiv und haben Sie einen Spitzenwert.

Das Archiv enthält Demo-Anwendungen für iOS und OSX, Komponententests und mehr. Sie interessieren sich nur für den Ordner mit dem Namen JSONModel. Ziehen Sie es in Ihr Xcode-Projekt. Die Installation ist noch einfacher, wenn Sie CocoaPods verwenden.

Schritt 2: Erstellen Sie Modellklassen

Der JSON-Feed, den Sie verwenden werden, ist ziemlich einfach. Es enthält ein Array von Witzen, wobei jeder Witz eine ID, den Witz selbst und optional ein Array von Tags hat.

"id": 7, "text": "Früher gab es eine Straße, die nach Chuck Norris benannt wurde, aber sie wurde geändert, weil niemand Chuck Norris kreuzt und lebt", "tags": ["id": 1, "tag" : "lethal", "id": 2, "tag": "new"]

Beginnen wir mit dem Erstellen der Modellklassen, die den JSON-Daten entsprechen. Erstellen Sie eine neue Klasse, JokeModel, und machen es erben von JSONModel. Hinzufügen Ich würde und Text Eigenschaften, die den Schlüsseln in den JSON-Daten entsprechen:

@interface JokeModel: JSONModel @property (zuweisen, nichtatomisch) int id; @ property (strong, nonatomic) NSString * Text; @Ende

Die JSONModel-Bibliothek konvertiert Zahlen automatisch entsprechend dem Typ der Eigenschaft.

Sie müssen auch eine Klasse für die Tag-Objekte in den JSON-Daten erstellen. Erstellen Sie eine neue Klasse, TagModel, und machen es erben JSONModel. Deklarieren Sie zwei Eigenschaften Ich würde und Etikett vom Typ NSString. Das TagModel Klasse sollte so aussehen:

@interface TagModel: JSONModel @property (stark, nichtatomisch) NSString * id; @ property (stark, nichtatomisch) NSString * -Tag; @Ende

Beachten Sie, dass Sie den Typ von festgelegt haben Ich würde zu NSString. JSONModel weiß genau, wie man Zahlen in Strings umwandelt, es wird die Umwandlung für Sie erledigen. Die Idee ist, dass Sie sich nur auf die Daten konzentrieren müssen, die Sie in Ihrer Anwendung benötigen, ohne sich darum kümmern zu müssen, wie die JSON-Daten aussehen.

Obwohl die TagModel Klasse ist einsatzbereit, Sie brauchen eine Möglichkeit, das zu erkennen JokeModel Klasse, dass der Schlüssel Stichworte enthält eine Liste von TagModel Instanzen. Dies ist mit JSONModel sehr einfach möglich. Fügen Sie ein neues leeres Protokoll in hinzu TagModel.h und nenne es TagModel:

@protocol TagModel @end

Öffnen JokeModel.h und importieren Sie die Header-Datei des TagModel Klasse:

#import "TagModel.h"

Hier kommt die Magie. Deklarieren Sie eine neue Eigenschaft für JokeModel wie unten gezeigt. Das Stichworte Eigenschaft ist vom Typ NSArray und es entspricht zwei Protokollen.

@ property (stark, nichtatomar) NSArray* Stichworte;
  1. TagModel ist das Protokoll, das Sie vor einem Moment erklärt haben. Es sagt JokeModel dass das Array von Tags Instanzen des enthält TagModel Klasse.
  2. Durch das Festhalten an der Wahlweise Protokoll, das JokeModel Die Klasse weiß, dass die JSON-Daten nicht immer eine Liste von Tags enthalten.

Dies ist ein guter Moment, um zu betonen, dass jede Eigenschaft in Ihrer Modellklasse standardmäßig verwendet wird erforderlich. Ob Ich würde oder Text In den JSON-Daten fehlt die Initialisierung der JokeModel Objekt wird fehlschlagen. jedoch, wenn Stichworte fehlen für einen bestimmten Witz, JSONModel wird sich nicht darüber beklagen.

Schritt 3: Controller-Setup anzeigen

Sie müssen zuerst einige Anpassungen an der vornehmen ViewController Klasse. Aufmachen ViewController.m und unter der vorhandenen import-Anweisung oben importieren Sie die JokeModel Klasse:

#import "JokeModel.h"

Sie müssen der ViewController-Klasse zwei Eigenschaften hinzufügen:

  • Etikette um den Text des Witzes auf dem Bildschirm anzuzeigen
  • Witze das Array von Witzen speichern
@interface ViewController () @property (stark, nicht atomar) UILabel * -Label; @property (stark, nichtatomar) NSArray * Witze; @Ende

Sie müssen auch das Etikett so einrichten, dass es immer dann bereit ist, wenn Sie die JSON-Daten abrufen und ein Witz angezeigt werden soll. Aktualisieren Sie die viewDidLoad Methode wie unten gezeigt.

- (void) viewDidLoad [super viewDidLoad]; self.label = [[UILabel zuteilen] initWithFrame: self.view.bounds]; self.label.numberOfLines = 0; self.label.textAlignment = NSTextAlignmentCenter; Eigenmarke α = 0; [self.view addSubview: self.label]; [Self FetchJokes]; 

Sie erstellen eine UILabel Beispiel die Größe des Bildschirms des Geräts und Sie legen es fest Alpha Eigentum an 0. Das Etikett wird ausgeblendet, bis der erste Witz angezeigt werden kann.

In der letzten Zeile von viewDidLoad, du rufst an Abrufjokes, Die Anwendung holt die Remote-JSON-Daten ab und speichert ihren Inhalt im View-Controller Witze Eigentum. Sie implementieren Abrufjokes in einem moment.

Schritt 4: Holen Sie sich JSON und erstellen Sie Modellobjekte

In diesem Beispiel verwenden Sie die NSURLSession Klasse, um die Remote-JSON-Daten abzurufen. Sie erstellen die URL für die Anforderung, initialisieren eine Datenaufgabe und senden sie auf dem Weg ab.

- (void) fetchJokes NSURL * jokesUrl = [NSURL URLWithString: @ "https://s3.amazonaws.com/com.tuts.mobile/jokes.json"]; [[[NSURLSession sharedSession] dataTaskWithURL: jokesUrl completionHandler: ^ (NSData * -Daten, NSURLResponse * -Antwort, NSError * -Fehler) // Daten hier handhaben] fortsetzen];  

dataTaskWithURL: completionHandler: schafft für ein NSURLSessionDataTask Instanz mit der URL, die an sie übergeben wird. Durch anrufen fortsetzen auf der datenaufgabe sagen sie das NSURLSession Instanz, um die Datentask ihrer Warteschlange hinzuzufügen.

Als Nächstes müssen Sie den Code hinzufügen, um das zu initialisieren JokeModel Instanzen. Ersetzen // hier mit Daten umgehen mit:

self.jokes = [JokeModel arrayOfModelsFromData: Datenfehler: Null];

arrayOfModelsFromData: Fehler: nimmt ein NSData Objekt aus einer JSON-Antwort und gibt ein Array von Modellen zurück. Aber was passiert unter der Haube??

  1. [JokeModel arrayOfModelsFromData: Fehler:] übernimmt die JSON-Daten und wandelt sie in ein Array von JSON-Objekten um.
  2. Dann JokeModel Schleifen über diese Objekte und erstellt JokeModel Instanzen von jedem JSON-Objekt.
  3. Jeder JokeModel Die Instanz prüft die empfangenen JSON-Daten und initialisiert ihre Eigenschaften mit den richtigen Werten.
  4. Wenn die JokeModel Instanz findet Inhalt in den Daten Stichworte Schlüssel, dann wird ein Array von erstellt TagModel Instanzen aus dem mit dem Stichworte Schlüssel.

Wenn Sie nur eine Modellinstanz erstellen müssen, dann initWithData: und initWithString: sind die Methoden, die Sie verwenden müssen. Wir werden uns diese Methoden im nächsten Tutorial genauer ansehen.

Nachdem Sie das Array von Witzen initialisiert haben, können Sie dem Benutzer den ersten Witz mithilfe des folgenden Codeausschnitts anzeigen.

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

Schritt 5: Anzeigen von Witzen

- (void) showNextJoke JokeModel * model = self.jokes [arc4random ()% self.jokes.count]; NSString * tags = model.tags? [Model.tags componentsJoinedByString: @ ","]: @ "keine Tags"; self.label.text = [NSString stringWithFormat: @ "% i.% @ \ n \ n% @", model.id, model.text, tags]; [UIView animateWithDuration: 1.0 Animationen: ^ self.label.alpha = 1.0;  completion: ^ (BOOL beendet) [self performSelector: @selector (hideJoke) withObject: nil afterDelay: 5.0]; ]; 

Du ziehst zuerst einen zufälligen Witz aus Witze Array und speichern Sie es in Modell-. Wenn der Witz Tags enthält, speichern Sie diese als durch Kommas getrennte Liste in einer Variablen mit dem Namen Stichworte. Wenn der Witz keine Tags hat, setzen Sie Stichworte zu @"keine Tags".

Sie aktualisieren das Label, um das anzuzeigen Ich würde, Text, und Stichworte des aktuellen Witzes und verwenden Sie eine Fade-Animation, um dem Benutzer den Witz zu zeigen.

Wenn die Animation abgeschlossen ist, warten Sie fünf Sekunden, bevor Sie sie aufrufen HideJoke, was verbirgt den Witz mit einer anderen Fade-Animation. Wenn die Animation abgeschlossen ist, rufen Sie auf showNextJoke Noch einmal.

- (void) hideJoke [UIView animateWithDuration: 1.0 Animationen: ^ self.label.alpha = 0.0;  completion: ^ (BOOL beendet) [self showNextJoke]; ]; 

Dadurch entsteht eine Endlosschleife, die zufällig ausgewählte Witze ein- und ausblendet. Der Effekt ist ziemlich cool. Probieren Sie es aus, indem Sie die Anwendung ausführen.

Es besteht jedoch das Problem, dass das Array mit Tags ausgedruckt wird TagModel Objekte statt String-Objekte. Dieses Verhalten ist eigentlich eine Funktion der JSONModel-Bibliothek. Es erstellt automatisch eine Beschreibung des Objekts, wie Sie es im vorherigen Screenshot gesehen haben. Es listet die Eigenschaften des Modellobjekts und deren Werte auf, was beim Debuggen wirklich hilfreich ist.

Schritt 6: Anpassen von Modellen

Zum Abschluss dieses Tutorials schreiben Sie Ihre erste Zeile mit Modellcode. Modelle, die von erben JSONModel sind wie jede andere Objective-C-Klasse. Dies bedeutet, dass Sie die Methoden von überschreiben können JSONModel und passen Sie ihr Verhalten an, wie Sie möchten.

Öffnen TagModel.m und überschreiben Sie die Standardbeschreibungsmethode:

- (NSString *) Beschreibung return self.tag; 

Wenn du jetzt anrufst KomponentenJoinedBySeparator: im Array von Tags anstelle der Standardbeschreibung von TagModel Sie erhalten das Tag nur als Text.

Probieren Sie es aus, indem Sie die Anwendung noch einmal ausführen. Sie sollten jetzt die Liste der Tags unter jedem Witz sehen.

Fazit

Sie haben jetzt ein grundlegendes Verständnis der JSONModel-Bibliothek. Bisher hast du gelernt:

  • So erstellen Sie eine einfache Modellklasse, von der erbt wird JSONModel
  • So definieren Sie erforderliche und optionale Eigenschaften
  • und wie man Modellklassen verschachtelt

In diesem kurzen Tutorial habe ich nur einige der Features des JSONModel Bibliothek. In den nächsten Versionen dieser Serie erfahren Sie mehr über die Datentransformation und die Arbeit mit Remote-JSON-APIs. Außerdem erfahren Sie mehr über erweiterte JSONModel-Funktionen.