Über die Grundlagen von JSONModel hinaus

In meinem vorherigen Artikel haben Sie die Grundlagen von JSONModel kennengelernt. Sie haben gesehen, wie einfach es ist, mit JSON mit JSONModel zu arbeiten, und wie es hinter den Kulissen viel für Sie leistet, wie zum Beispiel Datenvalidierung und -konvertierung.

In diesem Lernprogramm erstellen Sie eine komplexere Anwendung und lernen eine Reihe von Funktionen kennen, die Ihre Modellklassen noch leistungsfähiger machen.

Am Ende dieses Artikels haben Sie einen Flickr-Browser für iOS erstellt. Die Anwendung spricht mit der JSON-API von Flickr und zeigt eine Sammlung von Fotos an, die ich für dieses Lernprogramm auf Flickr hochgeladen habe.

Du wirst lernen wie:

  • komplexe API-Antworten verarbeiten
  • Verwenden Sie JSONModels Datentransformationen für URLs und Datumsangaben
  • Zuordnung von JSON-Schlüsseln zu Eigenschaften mit unterschiedlichen Namen
  • Erstellen Sie benutzerdefinierte Datenkonvertierungen
  • API-Antworten vor der Verarbeitung, bevor sie analysiert werden

Der fertige Flickr-Browser sieht folgendermaßen aus:

1. Projekteinrichtung

Da wir uns auf die Funktionsweise von JSONModel konzentrieren werden, möchte ich zunächst mit einem grundlegenden Projekt beginnen. Sie finden das Projekt in den Quelldateien dieses Tutorials.

Öffnen Sie das Xcode-Projekt und nehmen Sie sich einen Moment Zeit, um den Inhalt zu überprüfen. Das Projekt hat ein einfaches Setup, einen Controller für eine einzelne Tabellensicht, der eine leere Tabellensicht zeigt. Ich habe auch zwei Bibliotheken in das Projekt aufgenommen, JSONModel und SDWebImage.

Erstellen Sie das Projekt, und führen Sie es aus, um sicherzustellen, dass das Projekt ohne Fehler kompiliert wird.

2. Antwortmodell

Werfen wir einen Blick auf den öffentlichen Foto-Feed von Flickr. Öffnen Sie den API-Endpunkt in Ihrem Browser und nehmen Sie sich einen Moment Zeit, um die Antwort zu überprüfen. Die Antwort enthält nur einige Schlüssel der obersten Ebene, wie z Titel und geändert. Es gibt auch einen Schlüssel namens Artikel enthält eine Liste von Fotoobjekten mit jeweils einem Titel, Verknüpfung, Beschreibung, usw.

Im folgenden Screenshot habe ich eines dieser Fotoobjekte in der Liste hervorgehoben Artikel Array, um Ihnen zu helfen, seine Eigenschaften herauszufinden.

Beginnen wir mit der Erstellung einer Modellklasse für die Antwort des öffentlichen Foto-Feeds. Erstellen Sie eine neue Klasse in Xcode, nennen Sie sie PublicFotosModel, und machen es erben von JSONModel. Sie interessieren sich für das Titel und geändert Wenn Sie die Schlüssel der JSON-Antwort angeben, fügen Sie der Schnittstelle des Servers zwei Eigenschaften mit denselben Namen hinzu PublicPhotoModel Klasse. Sie werden auch das Array mit Fotos abrufen und in einer Eigenschaft speichern, die wir benennen Artikel. Legen Sie den Typ der fest Artikel Eigentum an NSArray Wie nachfolgend dargestellt.

#import "JSONModel.h" @interface PublicPhotosModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ Eigenschaft (stark, nichtatomar) NSDate * modifiziert; @ property (strong, nonatomic) NSArray * -Elemente; @Ende

In diesem Beispiel verwenden Sie einen der integrierten Datentransformatoren von JSONModel. Wenn Ihre JSON-Antwort ein Datum enthält, das dem W3C-Format entspricht, können Sie die übereinstimmende Modelleigenschaft des Typs deklarieren NSDate und JSONModel wird wissen, was zu tun ist.

Ihre grundlegende Modellklasse zum Abrufen von JSON-Daten von der Flickr-API ist fertig. Verbinden wir es mit der Tabellensicht in Ihrem View-Controller. Sie werden das verwenden Artikel Array in Ihrem Modellobjekt, das die Antwort der Flickr-API darstellt, als Datenquelle der Tabellenansicht.

Hinweis: Möglicherweise fragen Sie sich, wie Datumsangaben konvertiert werden, wenn sie nicht dem W3C-Standard entsprechen oder die JSON-Antwort Zeitstempel enthält. Weiter lesen. Vor dem Ende dieses Lernprogramms wissen Sie, wie Sie einen beliebigen Wert in ein Objective-C-Objekt umwandeln.

3. JSON von der Flickr-API abrufen

Beginnen Sie mit dem Öffnen ViewController.m und fügen Sie unter der vorhandenen import-Anweisung eine import-Anweisung für die gerade erstellte Modellklasse hinzu:

#import "PublicPhotosModel.h"

Als Nächstes deklarieren Sie eine private Eigenschaft zum Speichern von PublicFotosModel Beispiel verwenden wir:

@Interface ViewController () @Eigenschaft (stark, nicht atomar) PublicPhotosModel * photosModel; @Ende

Sie holen die JSON-Daten mithilfe einer Hilfsmethode ab, FetchPhotos, welche wir in Kürze umsetzen werden. Wir rufen an FetchPhotos in der Ansicht Controller viewDidLoad Methode:

- (void) viewDidLoad [super viewDidLoad]; // Fotos abrufen [selbst Abrufbilder]; 

Im FetchPhotos, Wir verwenden die NSURLSession-Klasse, um die Flickr-API abzufragen, wie Sie unten sehen können:

- (void) fetchPhotos NSURL * photosURL = [NSURL-URLWithString: @ "http://api.flickr.com/services/feeds/photos_public.gne?id=46760712@N07&lang=en-us&format=json&nojsoncallback=1"]; [[[[NSURLSession sharedSession] dataTaskWithURL: photosURL completionHandler: ^ (NSData * -Daten, NSURLResponse * -Antwort, NSError * -Fehler) // Process Data] Lebenslauf]; 

Die Implementierung ist ziemlich ähnlich wie in dem vorherigen Artikel über JSONModel. Du erklärst zuerst photosURL, die die URL eines bestimmten Feeds von Fotos auf Flickr enthält, und dann erstellen und auslösen NSURLSessionDataTask Instanz, um die Liste der Fotos dieses Feeds abzurufen.

Hinweis: Wenn Sie über ein Flickr-Konto verfügen und Ihre Flickr-ID kennen, geben Sie diese bitte in die Anforderungs-URL ein, damit die Anwendung Ihren eigenen Foto-Feed abrufen kann.

Wenn Sie den ersten Artikel über JSONModel gelesen haben, wissen Sie bereits, wie man das ändert NSData Von der Datentask zurückgegebenes Objekt in eine JSONModel Objekt. Flickr gibt jedoch nicht immer eine gültige JSON-Antwort zurück. Mit anderen Worten, Sie müssen einige Vorverarbeitungen durchführen, bevor Sie Ihr Modellobjekt erstellen.

Die Flickr-API hat ein besonderes Merkmal in der JSON-Antwort werden einfache Anführungszeichen vermieden. Das Problem ist, dass dies die JSON-Antwort gemäß den aktuellen Standards ungültig macht und als Ergebnis die JSON-Antwort NSJSONSerialisierung API kann es nicht verarbeiten.

Um dies zu beheben, müssen Sie nur die mit einem Escapezeichen versehenen einfachen Anführungszeichen in der JSON-Antwort entfernen. Sie können dann Ihr Modellobjekt sicher erstellen. Ersetzen // Prozessdaten mit dem folgenden Ausschnitt:

NSString * rawJSON = [[NSString-Zuordnung] initWithData: Datenkodierung: NSUTF8StringEncoding]; rawJSON = [rawJSON stringByReplacingOccurrencesOfString: @ "\\ '" withString: @ "'"]]; self.photosModel = [[PublicPhotosModel-Zuordnung] initWithString: rawJSON-Fehler: Null]; dispatch_async (dispatch_get_main_queue (), ^ self.title = self.photosModel.title; [self.tableView reloadData];);

Sie beginnen mit der Erstellung einer NSString Objekt aus der NSData Instanz kehrt die Datenaufgabe an Sie zurück. Es kann davon ausgegangen werden, dass der Text UTF8-codiert ist, da Flickr nur UTF8 verwendet. Sie ersetzen dann alle Vorkommen von \ ' mit ' um die JSON-Antwort für JSONModel vorzubereiten.

Da Sie die JSON-Antwort bereits als Zeichenfolgenobjekt haben, können Sie den benutzerdefinierten JSONModel-Initialisierer verwenden, initWithString: Fehler: um die Modellinstanz zu erstellen. Sie verwenden GCD, um die Benutzeroberfläche des Hauptthreads zu aktualisieren. Der Titel des View-Controllers wird mit dem aktualisiert Titel Eigentum der PublicFotosModel Instanz und die Tabellensicht wird neu geladen.

Erstellen Sie das Projekt, und führen Sie es aus, um zu überprüfen, ob der Titel festgelegt ist. Dies zeigt an, dass das Modellobjekt ordnungsgemäß initialisiert wurde. Geben Sie der Anwendung einen Moment, um die JSON-Daten von der Flickr-API abzurufen. Sie sollten dann den Titel des Feeds oben auf dem Bildschirm sehen:

Wenn der Titel des Feeds aus irgendeinem Grund nicht wie in der Abbildung oben angezeigt wird, fügen Sie im Completion-Handler der Datentask eine Protokollanweisung zum Debuggen des Problems hinzu. Wenn Sie prüfen möchten, ob beim Erstellen des Modellobjekts ein Fehler aufgetreten ist, aktualisieren Sie die Initialisierung des Modellobjekts wie folgt:

NSError * err; self.photosModel = [[PublicPhotosModel-Zuordnung] initWithString: rawJSON-Fehler: & err]; if (err) NSLog (@ "PublicPhotosModel,% @ kann nicht initialisiert werden", err.localizedDescription); 

Wie Sie sehen, verwendet JSONModel das Standard-Fehlerbehandlungsparadigma von Cocoa, dh Sie können überprüfen, ob initWithString: Fehler: wirft einen Fehler.

4. Implementieren Sie die Tabellenansicht

Im Moment behandelt JSONModel das Array von Elementen als ein gewöhnliches Array, das enthält NSDictionary Objekte. Dies ist vorerst in Ordnung, aber wir werden später in diesem Tutorial ein passendes Fotomodell erstellen. Es ist an der Zeit, die Tabellenansicht mit den Elementen im Array zu füllen.

Beginnen wir mit dem Aufbau der Benutzeroberfläche. Zuerst legen Sie den Titel der Kopfzeile der Tabellensicht fest, in der das Datum der letzten Änderung des Flickr-Feeds angezeigt wird. Sie können eine verwenden NSDateFormatter Instanz zum Konvertieren der NSDate Objekt in eine lesbare Zeichenfolge und geben Sie es von zurück tableView: titleForHeaderInSection::

- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) Abschnitt NSDateFormatter * formatter = [[NSDateFormatter-Zuordnung] init]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterMediumStyle; return [formatierer stringFromDate: self.photosModel.modified]; 

Fügen Sie anschließend die zwei erforderlichen Methoden des Tabellenquellen-Datenquellenprotokolls hinzu, um der Tabellensicht mitzuteilen, wie viele Abschnitte und Zeilen darin enthalten sind. Benutzen self.publicPhotos.items als Datenquelle der Tabellensicht:

- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1;  - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt return self.photosModel.items.count; 

Weil die Bildansicht der UITableViewCell Die Klasse lädt keine Remote-Images asynchron. Sie benötigen einen benutzerdefinierten Wert UITableViewCell Unterklasse. Erstellen Sie eine neue Objective-C-Klasse, und nennen Sie sie ImageCell, und mache es eine Unterklasse von UITableViewCell. Öffnen ImageCell.h und fügen Sie eine Eigenschaft des Typs hinzu UIImageView, webImageView:

#einführen  @interface ImageCell: UITableViewCell @property (stark, nicht atomar) UIImageView * webImageView; @Ende

Öffnen ImageCell.m und überschreiben Sie den dort eingestellten Initializer-Xcode. Im initWithStyle:, Sie müssen die Standardbildansicht ausblenden und eine neue benutzerdefinierte Bildansicht erstellen. Glauben Sie es oder nicht, aber es ist das, was Sie brauchen, um Bilder asynchron in eine Tabellensichtzelle zu laden.

- (id) initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString *) reuseIdentifier self = [super initWithStyle: style reuseIdentifier: reuseIdentifier]; if (self) self.webImageView = [[UIImageView-Zuordnung] initWithFrame: CGRectMake (0.0, 0.0, 40.0, 40.0)]; [self addSubview: self.webImageView]; UIGraphicsBeginImageContextWithOptions (CGSizeMake (20.0, 20.0), NO, kNilOptions); self.imageView.image = UIGraphicsGetImageFromCurrentImageContext (); UIGraphicsEndImageContext ();  return self; 

Sind Sie durch die zweite Hälfte der Implementierung verwirrt? Sie erstellen ein leeres Bild von 20 x 20 Pixel und legen es als das Bild der Standardbildansicht der Zelle fest. So legen Sie die Beschriftung der Zelle richtig fest. Dies geschieht sogar, bevor das Bild für Ihre benutzerdefinierte Bildansicht aus dem Web geladen wird.

Erneut besuchen ViewController.m Fügen Sie unter den vorhandenen Importanweisungen eine Importanweisung für den Benutzer hinzu UITableViewCell Klasse, die wir geschaffen haben.

#import "ImageCell.h"

Sie sind bereit für das letzte Puzzleteil, die Datenquellenmethode zum Erstellen der Zellen für Ihre Tabelle:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; if (! cell) cell = [[ImageCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId];  cell.textLabel.text = [@ (indexPath.row) stringValue]; zurück Zelle; 

Erstellen Sie das Projekt erneut, und führen Sie es erneut aus, um zu sehen, dass die Tabelle jetzt für jedes der gefundenen Objekte eine Zelle anzeigt Artikel. Apropos Artikel, Es ist Zeit, das Fotomodell zu erstellen.

5. Fotomodell

Wie wir im vorherigen Tutorial gesehen haben, müssen Sie eine separate Modellklasse für eine Liste von Objekten in der JSON-Antwort erstellen, in unserem Beispiel die Liste der Fotoelemente. Erstellen Sie eine neue Objective-C-Klasse, und nennen Sie sie Fotomodell, mache es eine Unterklasse von JSONModel.

Schauen Sie sich noch einmal die rohe JSON-Antwort an, die Sie von der Flickr-API erhalten, und entscheiden Sie, welche Schlüssel jedes Fotoobjekt haben muss:

Sie möchten den Titel, die URL des Fotos, als es veröffentlicht wurde, und den Link zur Detailseite von Flickr abrufen. Wir haben jedoch ein Problem. Die URL des Fotos befindet sich in einem weiteren Objekt unter der Medien Schlüssel. Bedeutet dies, dass Sie ein anderes erstellen müssen JSONModel Unterklasse nur zum Extrahieren des einzelnen Schlüssels, m, mit der URL des Fotos?

Zum Glück ist die kurze Antwort Nein. Um dieses Problem auf elegante Weise zu lösen, müssen Sie die Funktionsweise der Schlüsselzuordnung in JSONModel kennen und verstehen lernen. Das Zuordnen von Schlüsseln ist eine einfache Methode, um Ihre JSONModel-Unterklasse mitzuteilen, wie Daten aus einer JSON-Antwort extrahiert werden sollen. Dies ist besonders hilfreich, wenn die JSON-Schlüssel nicht genau mit den Namen der Klasseneigenschaften übereinstimmen.

Beginnen Sie mit der Deklaration der Eigenschaften, die wir benötigen Fotomodell Klasse:

#import "JSONModel.h" @interface PhotoModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ property (strong, nonatomic) NSURL * url; @ Eigenschaft (stark, nichtatomar) NSURL * link; @ Eigenschaft (stark, nichtatomisch) NSDate * veröffentlicht; @Ende

Wir verwenden zwei der eingebauten Datentransformatoren von JSONModel. Das veröffentlicht ist vom Typ NSDate und JSONModel stellt sicher, dass das konvertiert wird W3C Datum zu einem NSDate Objekt. Das url und Verknüpfung Eigenschaften sind vom Typ NSURL und JSONModel konvertiert die entsprechenden Zeichenfolgen der JSON-Antwort in NSURL Objekte.

Öffnen PhotoModel.m Fügen Sie das folgende Code-Snippet hinzu, um die Schlüsselzuordnung für das Fotomodell einzurichten:

+ (JSONKeyMapper *) keyMapper NSDictionary * map = @ @ "Published": @ "date", @ "media.m": @ "url"; return [[JSONKeyMapper-Zuordnung] initWithDictionary: map]; 

Im keyMapper, Sie überschreiben JSONModels keyMapper Methode. Es wird ein zurückgegeben JSONKeyMapper Instanz, das Objekt, das JSON-Schlüssel zu Eigenschaftsnamen zuordnet. Das JSONKeyMapper Die Klasse verfügt über einen praktischen Initialisierer, der ein Wörterbuch akzeptiert und eine Schlüsselzuordnung zwischen den JSON-Daten und Ihrer Klasse erstellt. 

In der obigen Implementierung von keyMapper, Sie definieren die folgende Schlüsselzuordnung:

  • Das veröffentlicht Geben Sie die JSON-Antwort in das Modell ein Datum Eigentum.
  • Das m Schlüssel der Medien Objekt in der JSON-Antwort wird zugeordnet url im Modell.

Mit keyMapper implementiert, kann JSONModel die JSON-Antwort parsen und das Fotomodell initialisieren, wie von der definiert Fotomodell Klasse.

Bevor Sie fortfahren, öffnen Sie sich PhotoModel.h noch einmal und deklarieren Sie oben ein Protokoll mit demselben Namen wie der Name der Klasse:

#import "JSONModel.h" @protocol PhotoModel @end @interface PhotoModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ property (strong, nonatomic) NSURL * url; @ Eigenschaft (stark, nichtatomar) NSURL * link; @ Eigenschaft (stark, nichtatomisch) NSDate * veröffentlicht; @Ende

6. Anzeigen des Foto-Feeds

Wechseln zu PublicPhotoModel.h und fügen Sie oben eine Importanweisung ein:

#import "PhotoModel.h"

Damit das alles funktioniert, machen Sie das Artikel Eigentum haftet an der Fotomodell Protokoll, das wir vor kurzem in der Fotomodell Klasse:

@ property (stark, nichtatomar) NSArray *Artikel;

Sie müssen jetzt einige Anpassungen an Ihrem Computer vornehmen ViewController Klasse. Um Fotos in die Zellen Ihrer Tabellenansicht zu laden und anzuzeigen, verwenden Sie eine in der deklarierte Methode SDWebImage Bibliothek, die in dem Projekt enthalten war, mit dem Sie begonnen haben. Öffnen ViewController.m und fügen Sie eine neue Importanweisung oben ein:

 #import "UIImageView + WebCache.h"

Als nächstes überdenken Sie Ihre Implementierung von tableView: cellForRowAtIndexPath: in dem Sie momentan nur die Zeilennummer anzeigen. Da Sie aber jetzt das entsprechende abrufen können Fotomodell Objekt für jede Zeile in der Tabellenansicht, ist es besser, stattdessen die Details des Fotos anzuzeigen. Aktualisieren Sie die Implementierung wie folgt:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; if (! cell) cell = [[ImageCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId];  PhotoModel * photo = self.photosModel.items [indexPath.row]; cell.textLabel.text = photo.title; [cell.webImageView setImageWithURL: photo.url placeholderImage: nil]; zurück Zelle; 

Sie holen zuerst die Fotomodell Ein Objekt, das der Zeile in der Tabellenansicht entspricht, und Sie füllen dann die Beschriftung der Zelle mit dem Titel des Fotos auf. Sie verwenden SDWebImage setImageWithURL: placeholderImage: das Foto asynchron von der angegebenen URL laden und anzeigen.

Ob Sie es glauben oder nicht, Sie haben bereits einen funktionierenden Fotostream. Erstellen und führen Sie das Projekt aus, um das Ergebnis anzuzeigen:

7. Benutzerdefinierte Datentransformationen

In diesem Abschnitt erstellen Sie eine benutzerdefinierte Funktion für die Fotomodell Klasse, die eine Zeichenfolge aus der JSON-Antwort in eine benutzerdefinierte Objective-C-Klasse konvertiert. Hier erfahren Sie, wie Sie JSON-Daten in eine Objective-C-Klasse konvertieren.

In den JSON-Daten für ein Foto gibt es eine Stichworte Schlüssel, der eine Folge von Tags enthält. Sie fügen dem eine neue Eigenschaft hinzu Fotomodell Klasse. Der Typ dieser Eigenschaft ist eine benutzerdefinierte Objective-C-Klasse, die Tags behandeln kann.

Hinweis: Sie können JSON-Daten nicht in benutzerdefinierte Objective-C-Klassen konvertieren. Sie können JSON-Daten in jede Cocoa-Klasse konvertieren. Sie können beispielsweise eine Hex-Farbe konvertieren, z # cc0033, zu seinen UIColor Äquivalent. Lesen Sie weiter, um zu sehen, wie das geht.

Erstellen Sie eine neue Klasse, benennen Sie sie Stichworte, und mache es eine Unterklasse von NSObject. Öffnen Tags.h Fügen Sie eine Eigenschaft hinzu, um die Liste der Tags zu speichern und einen benutzerdefinierten Initialisierer zu deklarieren:

#einführen  @interface-Tags: NSObject @property (stark, nicht atomar) NSArray * -Tags; #pragma mark - #pragma mark Initialisierung - (instancetype) initWithString: (NSString *) string; @Ende

Wechseln zu Tags.m und Implementierung des gerade deklarierten Initialisierers. Sie sehen, es ist nichts Besonderes. Mit der Zeichenfolge erstellen Sie ein Array von Tags und speichern die Tags in Stichworte:

- (instancetype) initWithString: (NSString *) Zeichenfolge self = [super init]; if (self) self.tags = [Zeichenfolge componentsSeparatedByString: @ ""]];  return self; 

Sie haben jetzt einen Brauch Stichworte Klasse, aber wie verwenden Sie es in Ihrem Fotomodell? Öffnen PhotoModel.h, Importieren Sie die neue Klasse oben und deklarieren Sie eine neue Eigenschaft in der Schnittstelle der Klasse:

#import "JSONModel.h" #import "Tags.h" @protocol PhotoModel @end @interface PhotoModel: JSONModel @property (Kopie, nichtatomisch) NSString * title; @ property (strong, nonatomic) NSURL * url; @ Eigenschaft (stark, nichtatomar) NSURL * link; @ Eigenschaft (stark, nichtatomisch) NSDate * veröffentlicht; @ property (strong, nonatomic) Tags * Tags; @Ende

Erstellen und führen Sie Ihr Projekt so aus, wie es ist.

Weil der Stichworte Eigenschaft ist vom Typ Stichworte, Mit welchem ​​JSONModel nicht zu tun ist, stürzt die Anwendung ab und es wird folgende Fehlermeldung in der XCode-Konsole angezeigt:

Es ist Zeit, sich mit einer neuen Klasse der JSONModel-Bibliothek vertraut zu machen, der JSONValueTransformer Klasse. In den meisten Fällen ist das JSONValueTransformer arbeitet hinter den Kulissen und konvertiert grundlegende Datentypen für Sie, NSNumber zu einem schweben, NSString zu NSNumber, oder NSString zu NSDate. Die Klasse kann jedoch nicht mit benutzerdefinierten Klassen umgehen, da sie nicht weiß, wie sie damit arbeiten soll.

Das Schöne an JSONValueTransformer Sie können es erweitern, um zu lernen, wie Sie mit benutzerdefinierten Klassen oder einer beliebigen Cocoa-Klasse umgehen.

Wählen Neu> Datei… von Xcode's Datei Menü und wählen Sie Ziel-C-Kategorie aus der Liste der Vorlagen. Klicken Nächster weitermachen.

Benennen Sie die Kategorie Stichworte und setzen Kategorie ein zu JSONValueTransformer. Klicken Nächster weitermachen.

In dieser Kategorie auf JSONValueTransformer, Sie können die erforderlichen Methoden definieren, um die Eigenschaften des Typs zu behandeln Stichworte. Öffnen JSONValueTransformer + Tags.h und importieren Sie die Header-Datei des Stichworte Klasse. Fügen Sie der Schnittstelle der Kategorie die folgenden zwei Methoden hinzu:

#import "JSONValueTransformer.h" #import "Tags.h" @interface JSONValueTransformer (Tags) - (id) TagsFromNSString: (NSString *) Zeichenfolge; - (id) JSONObjectFromTags: (Tags *) - Tags; @Ende

Schauen wir uns die Namen dieser Methoden genauer an.

  • TagsFromNSString: besteht aus dem Namen der Klasse oder des Typs, in den Sie konvertieren möchten, Stichworte, gefolgt von Von und dann den Typ in den JSON-Daten für den jeweiligen Schlüssel, NSString. Kurz gesagt, wenn JSONModel eine Eigenschaft vom Typ findet Stichworte, Es wird versucht, einen JSON-Schlüssel des Typs zu finden NSString. Wenn eine Übereinstimmung gefunden wird, wird sie aufgerufen TagsFromNSString:.
  • JSONObjectFromTags: übernimmt die umgekehrte Konvertierung. Wenn JSONModel Ihr Modellobjekt wieder in JSON-Daten exportiert, muss eine Methode aufgerufen werden, die die Stichworte object und geben Sie einen richtigen String zurück. So heißt die Methode JSONObjectFrom gefolgt vom Namen der Klasse oder des Typs der Eigenschaft, Stichworte.

Wenn Sie diese beiden Methoden definiert haben, kann jede JSONModel-Unterklasse Objekte des Typs verarbeiten Stichworte. Hinzufügen einer Kategorie zu JSONValueTransformer ist eine sehr einfache Möglichkeit, die Modellklassen Ihrer Anwendung um Funktionalität zu erweitern.

Betrachten wir nun die Implementierung der beiden Methoden in unserer Kategorie. Lassen Sie uns zuerst die Methode implementieren, die ein akzeptiert NSString Objekt und gibt ein Stichworte Objekt:

- (id) TagsFromNSString: (NSString *) string return [[Tags zuteilen] initWithString: string]; 

Dank des benutzerdefinierten Initialisierers, initWithString:, Die Implementierung ist einfach. Es entnimmt die Zeichenfolge der Tags aus den JSON-Daten und gibt a zurück Stichworte Objekt, das Ihrem zugeordnet ist Stichworte Eigentum in der Fotomodell Klasse.

Als Nächstes implementieren Sie die zweite Methode, die aufgerufen wird, wenn das Modellobjekt in eine Zeichenfolge konvertiert wird. Diese Methode wird aufgerufen, wenn Sie JSONModels aufrufen toDictionary und tojson.

- (id) JSONObjectFromTags: (Tags *) tags return [tags.tags componentsJoinedByString: @ ""]]; 

Wenn ein PublicFotosModel Instanz initialisiert wird, wird sie automatisch erstellt Fotomodell Objekte und lagern sie in der Artikel Eigentum. Jeder Fotomodell Objekt erstellt auch eine Stichworte Objekt für seine Stichworte Eigentum. All dies geschieht automatisch dank der von uns erstellten Kategorie JSONValueTransformer.

Lassen Sie uns jetzt das nutzen Stichworte Eigentum in der Fotomodell Klasse. Öffnen ViewController.m und aktualisieren Sie die Implementierung von tableView: cellForRowAtIndexPath: indem Sie die Detailtextbeschriftung der Zelle mit der Liste der Tags des Fotos füllen.

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * const cellId = @ "ImageCell"; ImageCell * cell = [self.tableView dequeueReusableCellWithIdentifier: cellId]; if (! cell) cell = [[ImageCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellId];  PhotoModel * photo = self.photosModel.items [indexPath.row]; cell.textLabel.text = photo.title; cell.detailTextLabel.text = [photo.tags.tags componentsJoinedByString: @ ","]; [cell.webImageView setImageWithURL: photo.url placeholderImage: nil]; zurück Zelle; 

Erstellen Sie das Projekt und führen Sie es aus. Unter dem Titel des Fotos sollten die Tags für jedes Foto angezeigt werden.

Um unseren Flickr-Browser komplett zu machen, implementieren Sie tableView: didSelectRowAtIndexPath: des UITableViewDelegate Protokoll. Im tableView: didSelectRowAtIndexPath:, Wir holen das entsprechende Foto ab und öffnen die Detailseite des Fotos in Safari.

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [self.tableView deselectRowAtIndexPath: indexPath animated: YES]; PhotoModel * photo = self.photosModel.items [indexPath.row]; if ([[UIApplication sharedApplication] canOpenURL: photo.link]) [[UIApplication sharedApplication] openURL: photo.link]; 

Wenn Sie in der Tabellenansicht auf eine Zeile tippen, werden Sie zur Detailseite des Fotos auf Flickr geführt:

Fazit

In diesem Lernprogramm haben Sie komplexere und leistungsfähigere Funktionen der JSONModel-Bibliothek verwendet. Ich hoffe, Sie können sehen, was für ein Zeitsparer JSONModel sein kann und wie es Ihnen auf vielen Ebenen in Ihren iOS- und OS X-Projekten helfen kann. Wenn Sie mehr über JSONModel erfahren möchten, sollten Sie sich die Dokumentation der Bibliothek genauer ansehen.