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.
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.
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.
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.
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.
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.
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:
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.
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;
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.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.
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 anzuzeigenWitze
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.
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??
[JokeModel arrayOfModelsFromData: Fehler:]
übernimmt die JSON-Daten und wandelt sie in ein Array von JSON-Objekten um.JokeModel
Schleifen über diese Objekte und erstellt JokeModel
Instanzen von jedem JSON-Objekt.JokeModel
Die Instanz prüft die empfangenen JSON-Daten und initialisiert ihre Eigenschaften mit den richtigen Werten.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];);
- (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.
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.
Sie haben jetzt ein grundlegendes Verständnis der JSONModel-Bibliothek. Bisher hast du gelernt:
JSONModel
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.