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.
Î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.
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.
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.
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.
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.
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:
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.
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;
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ă.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.
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 ecranglume
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ă.
Î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ă?
[JokeModel arrayOfModelsFromData: eroare:]
ia datele JSON și o transformă într-o serie de obiecte JSON.JokeModel
buclele peste aceste obiecte și creează JokeModel
instanțe din fiecare obiect JSON.JokeModel
instanța inspectează datele JSON pe care le primește și își inițiază proprietățile cu valorile corespunzătoare.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];);
- (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.
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ă.
Acum aveți o înțelegere de bază a bibliotecii JSONModel. Până acum, ați aflat:
JSONModel
Î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.