Noțiuni de bază cu JSONModel

Ce este JSONModel?

Dispozitivele noastre iOS sunt conectate la Internet de cele mai multe ori și, desigur, majoritatea aplicațiilor de pe dispozitivele noastre se conectează la un server de la distanță pentru a apuca această bucată de date din când în când.

Unele aplicații consumă doar un pic de date, doar preluând cele mai recente titluri în fiecare oră sau cam așa ceva. Alte aplicații interacționează foarte mult cu un serviciu backend în timp ce utilizatorul navighează feed-ul lor social, citește mesajele postate și încarcă fotografii.

Zilele în care fiecare serviciu web a vorbit XML au trecut mult timp. În zilele noastre, majoritatea aplicațiilor mobile comunică cu serviciile web folosind JSON. Dacă intenționați să creați o aplicație mobilă care vorbește cu un backend de la distanță, este posibil să fie necesar să puteți trimite și primi JSON.

JSONModel este o bibliotecă open source scrisă în Obiectiv-C, care vă ajută să preluați JSON de pe un server, să îl parsezi și să inițializați clasele de model cu datele. Validă de asemenea datele JSON, cascadele prin modele imbricate și multe altele.

"Dar asteapta!" s-ar putea sa te gandesti "am scris deja o aplicatie iPhone care aduce unele JSON si il arata pe ecran. Asta a fost destul de usor!"

Păi, asta este parțial adevărat. NSJSONSerialization a fost disponibil de la iOS 5, deci este într-adevăr destul de ușor să convertiți un răspuns JSON la un NSDictionary obiect. Acest lucru funcționează bine pentru aplicații simple, dar crede-mă când spun că nu este o idee bună pentru o aplicație complexă cu un model complex de date. Să vedem cum JSONModel vă poate salva baconul.

Rețineți că sunt autorul JSONModel, dezvoltând și menținând biblioteca cu ajutorul contribuitorilor pe GitHub. Sunt evident părtinitoare, dar aceasta este o veste bună pentru tine, așa cum vei putea să înveți de la persoana care a creat biblioteca.

Caracteristici de bază

În această secțiune, voi sublinia pe scurt caracteristicile de bază ale bibliotecii. Dacă sunteți prea dornici să vă scufundați în cod, atunci săriți la următoarea secțiune, Aplicația Hello Chuck.

Cartografiere automată a modelelor JSON la modele

Când vă uitați la datele JSON care stochează obiectul dvs. de model, vă simțiți adesea înclinate să potriviți numele cheilor folosite în datele JSON. În sfârșit, scrieți codul care arată astfel:

self.firstName = [json objectForKey: @ "firstName"]; self.familyName = [json objectForKey: @ "familyName"]; self.age = [json objectForKey: @ "vârstă"];

Cu JSONModel, nu este nevoie să scrieți acest tip de cod de boilerplate. JSONModel desenează automat JSON la proprietățile clasei de model.

Validarea intrărilor

JSONModel inspectează automat proprietățile clasei dvs. de model și asigură că JSON-ul folosit pentru inițializarea unui obiect model se potrivește cu definiția clasei modelului. Dacă există o nepotrivire, atunci obiectul model nu va fi inițializat.

În plus, modelul verifică dacă datele JSON se potrivesc cu tipurile definite de clasa de model. Dacă obțineți o matrice în locul unui șir, de exemplu, datele JSON sunt considerate nevalide.

Transformarea datelor

Datorită specificației simple a JSON, este ușor de utilizat, dar elimină și o mulțime de metadate atunci când este folosit pentru a transfera date dintr-un backend unui client și invers. Un obiect JSON poate conține numai șiruri de caractere, numere, tablouri și obiecte.

În clasa de modele Obiectiv-C, de obicei aveți proprietăți de diferite tipuri, care nu se limitează la șiruri de caractere și numere, care sunt singurele tipuri de date acceptate de JSON. De exemplu, de multe ori aveți adrese URL într-un obiect JSON. Este ușor să convertiți un șir într-un obiect JSON la un NSURL obiect, dar partea enervantă este că trebuie să faceți asta singur.

JSONModel permiteți să definiți o dată transformările pentru tipurile de date și să le utilizați pe modelele dvs. De exemplu, dacă un răspuns JSON vă oferă o dată ca o marcă de timp sub forma unui întreg, atunci trebuie doar să spuneți JSONModel cum să convertiți întregul la un NSDate obiect o dată. Veți afla mai multe despre transformările de date în a doua tranșă a acestei serii.

Modele născute

De cele mai multe ori, un răspuns JSON are o structură complexă. Un obiect, de exemplu, poate conține unul sau mai multe obiecte. Uitați-vă la următorul obiect JSON.

"id": 10, "mai mult": "text": "ABC", "numără": 20 

JSONModel să vă lăudați și clasele de model. Nu contează dacă modelul dvs. conține un alt model sau o serie de obiecte model, JSONModel inspectează clasele de model și inițiază automat obiecte de tipul corect. Vom examina mai târziu modelele imbricate un pic mai târziu.

Asta e destulă teorie pentru acum. Să învățăm cum să folosim biblioteca JSONModel prin crearea unei simple exemple de aplicații.

Aplicația Hello Chuck

Acum, că aveți o idee de bază despre ceea ce face JSONModel, veți dezvolta o aplicație simplă care aduce un feed JSON de glume Chuck Norris și le arată utilizatorilor unul câte unul. După ce ați terminat, aplicația va arăta astfel:

Pasul 1: Configurarea proiectului

Lansați Xcode 5, creați un nou proiect selectând Nou> Proiect ... de la Fişier meniu și selectați Vizualizare individuală șablon din lista de Aplicația iOS template-uri.

Denumiți proiectul HelloChuck, spuneți Xcode unde doriți să îl salvați și loviți-l Crea. Nu este nevoie să puneți proiectul sub control sursă.

Apoi, descărcați cea mai recentă versiune a bibliotecii JSONModel de la GitHub, dezarhivați arhiva și obțineți un vârf interior.

Arhiva conține aplicații demo pentru iOS și OSX, teste de unitate și multe altele. Sunteți interesat doar de dosarul numit JSONModel. Glisați-l în proiectul dvs. Xcode. Instalarea este chiar mai ușoară dacă folosiți CocoaPods.

Pasul 2: Creați clase de model

Feed-ul JSON pe care îl veți folosi este destul de simplu. Acesta conține o serie de glume, fiecare glumă având un id, glumă în sine și, opțional, o serie de etichete.

"id": 7, "text": "Există o stradă numită după Chuck Norris, dar a fost schimbată pentru că nimeni nu traversează Chuck Norris și trăiește", "tag" : "letal", "id": 2, "tag": "nou"

Să începem prin crearea de clase de modele pentru a se potrivi cu datele JSON. Creați o nouă clasă, JokeModel, și să o moștenească JSONModel. Adăuga id și text proprietăți pentru a se potrivi cu tastele din datele JSON, cum ar fi:

@ interfață JokeModel: JSONModel @property (atribuiți, nonatomic) int id; @property (puternic, nonatomic) NSString * text; @Sfârșit

Biblioteca JSONModel va converti automat numerele pentru a se potrivi cu tipul proprietății.

De asemenea, trebuie să creați o clasă pentru obiectele de tag în datele JSON. Creați o nouă clasă, TagModel, și să o moșteni JSONModel. Declarați două proprietăți id și etichetă de tip NSString. TagModel clasa ar trebui să arate astfel:

@interface TagModel: JSONModel @property (puternic, nonatomic) NSString * id; @property (puternic, nonatomic) NSString * tag; @Sfârșit

Rețineți că ați setat tipul de id la NSString. JSONModel știe foarte bine cum să transformi numerele în șiruri, se va ocupa de transformare pentru tine. Ideea este că trebuie să vă concentrați doar asupra datelor de care aveți nevoie în aplicația dvs., fără a vă mai deranja cum arată datele JSON.

Chiar dacă TagModel clasa este gata de utilizare, aveți nevoie de o modalitate de a spune JokeModel clasa pe care cheia Etichete conține o listă de TagModel instanțe. Acest lucru este foarte ușor de făcut cu JSONModel. Adăugați un nou protocol gol în TagModel.h și spune-i TagModel:

@protocol TagModel @end

Deschis JokeModel.h și importați fișierul antet al fișierului TagModel clasă:

#import "TagModel.h"

Aici vine magia. Declarați o proprietate nouă JokeModel după cum se arată mai jos. Etichete proprietatea este de tip NSArray și este conform cu două protocoale.

@property (puternic, nonatomic) NSArray* Etichete;
  1. TagModel este protocolul pe care l-ați declarat acum o clipă. Se spune JokeModel că matricea de etichete ar trebui să conțină instanțe ale TagModel clasă.
  2. Prin aderarea la facultativ protocol, JokeModel clasa știe că datele JSON nu vor conține întotdeauna o listă de etichete.

Acesta este un moment bun pentru a sublinia faptul că fiecare proprietate din clasa dvs. de model este în mod implicit necesar. Dacă id sau text lipsesc datele JSON, inițializarea lui JokeModel obiect va eșua. Cu toate acestea, dacă Etichete sunt absente pentru o anumită glumă, JSONModel nu se va plânge de asta.

Pasul 3: Vizualizați configurarea controlerului

Mai întâi trebuie să faceți câteva ajustări ViewController clasă. Deschide ViewController.m și, sub declarația de import existentă în partea de sus, importați JokeModel clasă:

#import "JokeModel.h"

Trebuie să adăugați două proprietăți la clasa ViewController:

  • eticheta pentru a afișa textul glumei pe ecran
  • glume pentru a stoca gama de glume
@ interfata ViewController () @property (puternic, nonatomic) UILabel * label; @property (puternic, nonatomic) NSArray * glume; @Sfârșit

De asemenea, trebuie să configurați eticheta astfel încât să fie gata ori de câte ori preluați datele JSON și aveți o glumă pregătită pentru a fi afișată. Actualizați viewDidLoad așa cum se arată mai jos.

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

Creați a UILabel de exemplu dimensiunea ecranului dispozitivului și setați-o alfa proprietate la 0. Eticheta este ascunsă până când prima glumă este gata să fie afișată.

În ultima linie din viewDidLoad, sunați fetchJokes, în care aplicația preluă datele JSON la distanță și stochează conținutul în controlerul de vizualizare glume proprietate. Veți implementa fetchJokes într-o clipă.

Pasul 4: Preluați JSON și creați obiecte model

În acest exemplu, veți utiliza funcția NSURLSession pentru a prelua datele JSON la distanță. Creați adresa URL a solicitării, inițializați o sarcină de date și trimiteți-o pe drum.

- (void) fetchJokes NSURL * jokesUrl = [NSURL URLWithString: @ "https://s3.amazonaws.com/com.tuts.mobile/jokes.json"]; [[[NSURLSession sharedSession] dateTaskWithURL: jokesUrl completionHandler: ^ (date NSData *, răspuns NSURLResponse *, eroare NSError *) // gestionați datele aici] reluați];  

dataTaskWithURL: completionHandler: creează pentru un NSURLSessionDataTask exemplu cu adresa URL care a fost transmisă acestuia. Sunând relua pe sarcina de date, spuneți NSURLSession exemplu pentru a adăuga sarcina de date la coada de așteptare.

Apoi, trebuie să adăugați codul pentru a inițializa JokeModel instanțe. A inlocui // manipulați datele aici cu:

self.jokes = [JokeModel arrayOfModelsFromData: eroare de date: zero];

arrayOfModelsFromData: eroare: o ia NSData obiect dintr-un răspuns JSON și returnează o serie de modele. Dar ce se întâmplă sub capotă?

  1. [JokeModel arrayOfModelsFromData: eroare:] ia datele JSON și o transformă într-o serie de obiecte JSON.
  2. Atunci JokeModel buclele peste aceste obiecte și creează JokeModel instanțe din fiecare obiect JSON.
  3. Fiecare JokeModel instanța inspectează datele JSON pe care le primește și își inițiază proprietățile cu valorile corespunzătoare.
  4. În cazul în care JokeModel instanța găsește conținut în datele Etichete cheie, atunci creează o serie de TagModel de la valoarea asociată cu Etichete cheie.

Dacă trebuie să creați doar o instanță de model, atunci initWithData: și initWithString: sunt metodele pe care trebuie să le utilizați. Vom examina mai îndeaproape aceste metode în următorul tutorial.

După ce ați inițializat seria de glume, puteți afișa prima glumă utilizatorului utilizând următorul fragment de cod.

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

Pasul 5: Afișarea glumelor

- (void) showNextJoc JokeModel * model = auto.jokes [arc4random ()% self.jokes.count]; NSString * tags = model.tags? [Model.tags componentsJoinedByString: @ ","]: @ "no tags"; auto.label.text = [NSString șirWithFormat: @ "% i.% @ \ n \ n% @", model.id, model.text, etichete]; [Animații animateWithDuration UIView: 1.0 animații: ^ self.label.alpha = 1.0;  completare: ^ (BOOL finalizat) [self performSelector: @selector (hideJoke) withObject: nil afterDelay: 5.0]; ]; 

Mai întâi tragi o glumă aleatoare de la glume și păstrați-l în model. Dacă glumă are etichete, le stocați ca o listă separată prin virgulă într-o variabilă numită Etichete. Dacă glumă nu are etichete, setați Etichete la @ "fără etichete".

Actualizați eticheta pentru a afișa id, text, și Etichete din gluma curentă și folosiți o animație de decolorare pentru a arăta glumă utilizatorului.

Când animația se termină, așteptați cinci secunde înainte de a invoca hideJoke, care ascunde glumă cu o altă animație decolorată. Când animația se termină, sunați showNextJoke din nou.

- (void) hideJoke [Animații animateWithDuration: 1.0 animații: ^ self.label.alpha = 0.0;  completare: ^ (BOOL terminat) [self showNextJoke]; ]; 

Acest lucru creează o buclă infinită, înnegând și ieșind glume aleatorii selectate aleatoriu. Efectul este destul de rece. Faceți o încercare executând aplicația.

Cu toate acestea, există o problemă care afișează afișarea matricei de etichete TagModel obiecte în loc de obiecte de șir. Acest comportament este de fapt o caracteristică a bibliotecii JSONModel. Creează automat o descriere a obiectului ca cea pe care ați văzut-o în captura de ecran anterioară. Acesta afișează proprietățile obiectului modelului și valorile acestuia, care ajută cu adevărat la depanare.

Pasul 6: Modelarea modelelor

Pentru a încheia acest tutorial, veți scrie prima linie a modelului dvs. de cod. Modelele pe care le moștenesc JSONModel sunt la fel ca orice altă clasă Obiectiv-C. Aceasta înseamnă că puteți suprascrie metodele JSONModel și personalizați comportamentul acestora oricum doriți.

Deschis TagModel.m și suprascrie metoda de descriere implicită:

- (NSString *) descriere return self.tag; 

Când sunați acum componentsJoinedBySeparator: pe tabloul de etichete, în loc de descrierea implicită a TagModel veți obține eticheta ca text simplu.

Faceți o încercare, executați încă o dată aplicația. Ar trebui să vedeți acum că lista etichetelor apare cu atenție sub fiecare glumă.

Concluzie

Acum aveți o înțelegere de bază a bibliotecii JSONModel. Până acum, ați aflat:

  • cum să creați o clasă de model simplă care să moștenească JSONModel
  • cum să definiți proprietățile obligatorii și opționale
  • și cum să crăpăm clase de model

În acest scurt tutorial, am atins doar câteva din caracteristicile JSONModel bibliotecă. În următoarele tranșe ale acestei serii, veți afla mai multe despre transformarea datelor, lucrul cu API-urile JSON de la distanță și veți examina câteva funcții JSONModel mai avansate.

Cod