Păstrarea sincronizării datelor aplicațiilor pe toate dispozitivele este o sarcină complexă și descurajantă. Din fericire, acesta este exact motivul pentru care Apple a construit iCloud. În această serie Tuts + Premium, veți afla cum funcționează iCloud și modul în care aplicațiile dvs. pot partaja cu ușurință datele pe mai multe dispozitive.
În prima tranșă din această serie, am dat o introducere la iCloud și am concentrat în special pe stocarea iCloud. Două tipuri de stocare iCloud sunt disponibile pentru dezvoltatori, Valorare stocare cheie și Depozitarea documentelor. Valoarea de stocare cheie va fi punctul central al acestui tutorial.
Vom începe acest tutorial, analizând mai atent procesul de instalare a unei aplicații pentru utilizarea cu iCloud. Cu aplicația noastră configurată în mod corespunzător, vom utiliza stocarea cheie a lui iCloud pentru a păstra datele sincronizate ale aplicației pe mai multe dispozitive.
Nu putem testa sincronizarea datelor cu un singur dispozitiv. Pentru a finaliza acest tutorial, va trebui să aveți cel puțin două dispozitive iOS care rulează iOS 5 sau o versiune ulterioară. Din păcate, Simulatorul iOS nu poate fi folosit pentru a testa iCloud Storage.
Aplicația pe care o vom construi va fi o aplicație simplă iOS, ceea ce înseamnă că veți putea rula pe orice iPhone, iPod Touch sau iPad care rulează iOS 5 sau o versiune ulterioară. Citirea acestui tutorial va fi în continuare utilă chiar dacă nu aveți două dispozitive iOS separate pentru a fi utilizate pentru testare. Acesta vă va învăța cum este setat iCloud și cum puteți utiliza spațiul de stocare cheie al lui iCloud pentru a vă îmbunătăți propriile aplicații.
Voi începe prin a vă deplasa prin procesul de configurare a aplicației noastre de a utiliza iCloud Storage. Cu toate acestea, trebuie mai întâi să înființăm proiectul nostru Xcode.
Creați un nou proiect în Xcode selectând Vizualizare individuală șablon. Denumiți aplicația Noros, introduceți a identificatorul companiei, a stabilit iPhone pentru familia de dispozitive și verificați Utilizați numărarea automată a referințelor. Cărțile de selectare rămase nu ar trebui să fie bifate. Spuneți Xcode unde doriți să salvați proiectul și să îl loviți Crea.
Este esențial să alegeți cu atenție numele produsului și identificatorul companiei pentru acest proiect. Combinația dintre aceste două elemente formează identificatorul pachetului (împreună cu identificatorul semințelor de pachet) al aplicației dvs., pe care iCloud îl va utiliza pentru a vă identifica în mod unic aplicația. Verificați cu atenție ortografia, deoarece identificatorul pachetului este sensibil la minuscule.
După cum am menționat în primul articol al acestei serii Tuts + Premium, instalarea unei aplicații pentru a utiliza iCloud este ușor și implică numai doi pași. Permiteți-mi să vă trec prin procesul pas cu pas.
Deschideți browserul dvs. preferat și mergeți la centrul iOS Dev Center al Apple. Conectați-vă la contul dvs. de dezvoltator iOS și faceți clic pe Portalul de furnizare iOS link-ul din dreapta.
În primul rând, trebuie să creăm un ID-ul aplicației pentru aplicația noastră. Deschide ID-uri de aplicație din stânga și faceți clic pe Cod de identificare nou butonul din dreapta sus. Dați ID-ul dvs. de aplicație un nume descriptiv pentru ao identifica cu ușurință mai târziu. Apoi, introduceți identificatorul pachetului pe care l-am vorbit acum câteva minute. Identificatorul pachetului este combinația identificatorului companiei dvs., com.mobiletuts în exemplul nostru, și numele produsului, Noros în exemplul nostru. Puteți lăsa setul de identificare a semințelor de pachete setat la Utilizați ID-ul echipei, care este bine pentru aplicația noastră.
Verificați dublu că identificatorul pachetului dvs. este scris corect. După cum am menționat mai devreme, identificatorul bunder este sensibil la minuscule. Faceți clic pe butonul Trimiteți pentru a vă crea ID-ul aplicației.
ID-ul de aplicație nou creat ar trebui să fie prezent în lista ID-urilor de aplicații. Veți observa că iCloud este dezactivat în mod prestabilit pentru fiecare ID de aplicație nou creat. Să schimbăm asta. În partea dreaptă a ID-ului aplicației, faceți clic pe Configurarea buton. În partea de jos a paginii, ar trebui să vedeți o căsuță de selectare care spune Activați pentru iCloud. Bifați caseta de selectare și faceți clic pe Terminat. ID-ul aplicației noastre este acum configurat să funcționeze cu iCloud. Există încă un lucru pe care trebuie să ne ocupăm în timp ce ne aflăm în Portal de furnizare.
Pentru a ne asigura că aplicația noastră poate rula pe dispozitivele noastre, trebuie să creați un profil de provizionare. Încă în Portalul de furnizare iOS, deschideți Provizionarea din stânga și selectați Dezvoltare în partea de sus. Apasă pe Profil nou butonul din partea dreaptă sus și introduceți un nume descriptiv pentru noul dvs. profil. Apoi, selectați certificatul de dezvoltare la care doriți să fie asociat profilul și alegeți ID-ul corect al aplicației din lista verticală. În cele din urmă, selectați dispozitivele pe care le veți utiliza pentru testare din lista din partea de jos a paginii.
După ce faceți clic pe butonul de trimitere din partea dreaptă jos, veți observa că profilul dvs. de provizionare are o stare In asteptarea. După reîncărcarea paginii, starea profilului ar trebui să fie actualizată la Activ. Faceți clic pe butonul de descărcare de lângă profilul dvs. de provizionare și faceți dublu clic pe profil. Xcode va instala automat profilul pentru tine.
Mulți dezvoltatori se rătăcesc când aud cuvântul drepturi. Drepturile nu sunt de ce să vă speriați de ce ați înțeles pentru ce sunt. Drepturile conferă unei anumite aplicații capabilități specifice sau permisiuni de securitate. Acesta este tot ceea ce există. Este o listă simplă de perechi de chei-valoare care spun sistemului de operare ceea ce poate și nu poate face aplicația dvs. și ce aplicații au acces la datele aplicației dvs. Acesta din urmă este deosebit de important atunci când lucrați cu iCloud.
În exemplul nostru, drepturile iCloud ne permit să permitem stocarea iCloud pentru aplicația noastră. Pentru a configura drepturile entității noastre, ne îndreptăm spre editorul țintă Xcode.
Faceți clic pe proiectul nostru în Project Navigator și selectați țintă din lista de destinații. Cu rezumat fila selectată, ar trebui să vedeți o secțiune numită drepturi în partea de jos. Bifați prima bifă pentru a activa drepturile pentru aplicația noastră. Această opțiune va crea un fișier de drepturi pentru aplicația noastră. Câmpul de text de sub casetă de selectare trebuie să fie prealabil pentru dvs. Acum avem opțiunea de a activa stocarea cheie iCloud și de stocare a documentelor iCloud.
În acest tutorial, voi vorbi doar despre stocarea cheie iCloud Key-Value, astfel că bifați caseta de selectare de lângă iCloud Key-Value Store. Din nou, Xcode completează câmpul de text de lângă caseta de selectare cu identificatorul pachetului de aplicații (fără identificatorul de semințe al pachetului). Verificați dacă acest identificator de pachet corespunde celui pe care l-ați introdus în portalul de provizionare atunci când ați creat ID-ul App. Voi vorbi despre iCloud Containers în tutorialul următor, care se referă la iCloud Document Storage.
În partea de jos a secțiunii drepturi, vedeți Grupuri de acces pentru chei. Această listă specifică aplicațiile care au acces la elementele cheie ale aplicațiilor dvs. Poți lăsa acea secțiune de neatins pentru moment.
Înainte de a ne murdări mâinile cu API-ul iCloud, trebuie să configurați setările noastre de construire. Încă în editorul țintă al Xcode, selectați Construiți setările și derulați în jos până la Semnarea codului secțiune. Setați identitatea de semnare a codului pentru debug și Eliberare configurații pentru a se potrivi cu profilul pe care tocmai l - am creat în Portalul de furnizare iOS.
Acest tutorial este oarecum avansat și, prin urmare, presupun că sunteți familiarizat cu conceptele de bază ale dezvoltării iOS. Aceasta înseamnă că voi mișca un pic mai repede decât am de obicei, deoarece avem o mulțime de teren pentru a acoperi.
Aplicația pe care urmează să o construim va fi un simplu manager de marcaje. Putem adăuga și șterge marcaje, iar marcajele noastre vor fi sincronizate pe dispozitivele noastre. Cat de tare e asta? Să începem.
Deschideți fișierul de antet al controlerului de vizualizare și creați o variabilă de tip (ivar) de tip NSMutableArray
cu un nume de marcaje. Ivarul va stoca marcajele noastre. Marcajele vor fi afișate într-un tabel. Creați o priză pentru vizualizarea tabelului din fișierul antet al controlorului nostru de vizualizare și asigurați-vă că conformați controlorul de vizualizare cu sursa de date din tabel și cu protocoalele delegate. De asemenea, nu uitați să sintetizați accesoriile pentru ambele proprietăți în fișierul de implementare al controlorului nostru de vizualizare. Apoi, adăugați două acțiuni la ViewController.h, editBookmarks: și adaugă semn de carte:. Gata? Mergeți la ViewController.xib fișier pentru a sârmă totul.
#import@ interfață ViewController: UIViewController NSMutableArray * _bookmarks; __weak UITableView * _tableView; @property (nonatomic, strong) NSMutableArray * marcaje; @property (nonatomic, slab) IBOutlet UITableView * tableView; - (IBAction) editBookmarks: (id) expeditor; - (IBAction) addBookmark: (id) expeditor; @Sfârșit
Începeți prin a glisa o bară de navigare în vizualizarea controlerului nostru și poziționați-o în partea superioară. Trageți o instanță a UIBarButtonItem
în stânga barei de navigare și setați identificatorul acesteia în Atribuții Inspector la Editați | ×. Trageți controlul de la butonul de editare la adresa noastră Proprietarul dosarului și selectați editBookmarks: metodă. Glisați un al doilea element al butonului de bare din partea dreaptă a barei de navigare și îi dați un identificator Adăuga. Trageți controlul de la butonul de adăugare la pagina noastră Proprietarul dosarului și selectați adaugă semn de carte: metodă. În cele din urmă, trageți o instanță a UITableView
la punctul de vedere al controlorului nostru și să conecteze sursa de date și să delege puncte de desfacere la Proprietarul dosarului obiect. Terminat.
Implementarea sursei de date a tabelei noastre și a protocoalelor delegate este simplă și simplă. În numberOfSectionsInTableView: , verificăm dacă sursa de date, adică marcajele noastre, nu este zero. Dacă este zero, vom întoarce 1. Dacă nu este, vom întoarce 0. The tableView: numberOfRowsInSection: metoda este aproape identică. În schimb, dacă sursa de date nu este zero, vom returna numărul elementelor pe care le conține. Dacă sursa de date este zero, vom returna 0.
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView if (self.bookmarks) retur 1; altceva return 0; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) secțiunea if (! Self.bookmarks) return 0; altceva return self.bookmarks.count;
În tableView: cellForRowAtIndexPath: , începem prin declararea unui identificator static al celulei în scopul reutilizării celulelor și apoi adresăm vizualizarea tabelului pentru o celulă reutilizabilă cu identificatorul de celule pe care tocmai l-am declarat. Dacă o celulă refolosibilă nu a fost returnată, inițializăm o nouă celulă cu un stil de UITableViewCellStyleSubtitle
și trecem identificatorul celulei noastre pentru reutilizarea celulelor. Apoi, preluăm marcajul corect din sursa de date. Fiecare marcaj va fi un dicționar cu două perechi cheie-valoare, a Nume și a URL-. Configurem celula setând eticheta de etichetă și eticheta de detaliu împreună cu numele și urlul marcajului respectiv.
- (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath NSString static * CellIdentifier = @ "Cell Identifier"; UITableViewCell * celula = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; dacă (celula == zero) cell = [[UITableViewCell alin] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier]; / / Fetch Bookmark NSDictionary * bookmark = [auto.bookmarks objectAtIndex: indexPath.row]; // Configure celula cell.textLabel.text = [marcajul objectForKey: @ "name"]; cell.detailTextLabel.text = [marcaj obiectForKey: @ "url"]; celule retur;
De asemenea, utilizatorul are opțiunea de a edita marcajele. În tableView: canEditRowAtIndexPath: ne întoarcem DA. tableView: commitEditingStyle: forRowAtIndexPath: este ceva mai complex. Începem prin a verifica dacă stilul de editare al celulei este egal cu UITableViewCellEditingStyleDelete
, adică un marcaj a fost șters. Mai întâi, actualizăm sursa de date ștergând marcajul din matricea marcajelor. Apoi salvăm sursa de date prin trimiterea controlerului de vizualizare a saveBookmarks mesaj și vom actualiza vizualizarea tabelului pentru a reflecta modificările aduse sursei de date.
- (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath return YES; - (void) tableView: (UITableView *) aTableView commitEditingStyle: (UITableViewCellEditingStyle) editareStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editingStyle ==UITableViewCellEditingStyleDelete) // Actualizați marcajele [self.bookmarks removeObjectAtIndex: indexPath.row]; // Salvați marcajele [self saveBookmarks]; // Actualizați vizualizarea tabelului [aTableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] cuRowAnimation: UITableViewRowAnimationFade];
Să aruncăm o privire la acțiunile noastre acum. editBookmarks: metoda nu ar putea fi mai ușoară. Schimbăm starea de editare a vizualizării de tabel într-un mod animat.
- (IBAction) editBookmarks: (id) expeditor [auto.tableView setEditing:! Self.tableView.editing animat: YES];
adaugă semn de carte: metoda necesită un pic mai mult de lucru. Inițializăm o nouă instanță AddBookmarkViewController
, un controler de vizualizare pe care îl vom crea în curând și vom seta proprietatea de vizualizare a controlerului de sine
. Apoi, prezentăm modalizat noul controler vizualizat. După cum sugerează și numele, AddBookmarkViewController
se ocupă de crearea de marcaje noi. Să aruncăm o privire mai atentă AddBookmarkViewController
.
- (IBAction) addBookmark: (id) expeditor // Initialize Add Bookmark View Controller AddBookmarkViewController * vc = [[AddBookmarkViewController alloc] initWithNibName: @ Bundle "AddBookmarkViewController": [NSBundle mainBundle]; vc.viewController = auto; // Prezentator vizualizare vizuală modală [self presentViewController: vc animat: YES finalizare: nil];
Implementarea sistemului AddBookmarkViewController
este foarte simplă, așa că nu voi intra în prea multe detalii. Controlerul de vizualizare are o referință slabă la controlerul nostru principal de vizualizare. Acest lucru îi permite să notifice controlerul nostru principal de vizualizare atunci când a fost creat un nou marcaj. De asemenea, are două ieșiri de tip UITextField
, care permite utilizatorului să introducă un nume și o adresă URL pentru fiecare marcaj.
#import@class ViewController; @ interfață AddBookmarkViewController: UIViewController __weak ViewController * _viewController; __weak UITextField * _nameField; __weak UITextField * _urlField; @property (nonatomic, slab) ViewController * viewController; @property (nonatomic, slab) IBOutlet UITextField * nameField; @property (nonatomic, slab) IBOutlet UITextField * urlField; @Sfârșit
Fișierul XIB conține o bară de navigare în partea de sus cu a Anulare și a Salvați buton. Vederea însăși conține câmpurile de nume și url de text pe care tocmai le-am menționat. Butoanele de anulare și salvare sunt conectate la a Anulare: și a Salvați: acțiune, respectiv. Anulare: acțiunea respinge pur și simplu controlerul nostru de vedere modal. Salvați: acțiunea este la fel de simplă. Creăm un nou marcaj (adică un exemplu de NSDictionary
) cu datele pe care utilizatorul le-a introdus în câmpurile de text și le spun controlorului principal de vizualizare despre noul marcaj. Este important să rețineți că aceasta nu este cea mai bună soluție pentru a lăsa controlorul nostru principal de vedere să știe când a fost creat un nou marcaj de către AddBookmarkViewController
. Această abordare introduce o cuplare strânsă, care ar trebui evitată cât mai mult posibil. O abordare mai bună ar fi adoptarea modelului de delegare.
- (IBAction) anulați: (id) expeditor [self dismissViewControllerAnimated: YES finalizare: nil]; - (IBAction) salvați: (id) expeditor NSString * name = auto.nameField.text; NSString * url = auto.urlField.text; NSDictionary * bookmark = [[NSDictionary alloc] initWithObjectsAndKeys: nume, @ "nume", url, @ "url", nil]; [self.viewController saveBookmark: marcaj]; [self dismissViewControllerAnimated: DA finalizat: zero];
Suntem aproape gata, dar încă mai trebuie să implementăm acest lucru saveBookmark: în modul nostru principal de vedere. Începeți prin a declara această metodă în fișierul de antet al controlorului nostru de vizualizare și apoi mergeți la fișierul de implementare. Implementarea este minimă. Adăugăm marcajul nou creat la sursa de date, salvăm sursa de date și apoi reîncărcați vizualizarea de tabel pentru a afișa semnul de carte pe care tocmai l-am adăugat.
- (void) saveBookmark: (NSDictionary *) marcaj // Adauga marcaj la marcaje [self.bookmarks addObject: bookmark]; // Salvați marcajele [self saveBookmarks]; // Reîncarcă tabelul [self.tableView reloadData];
Aplicația noastră nu este foarte utilă dacă marcajele utilizatorului nu sunt salvate pe disc. Utilizatorul își va pierde marcajele de fiecare dată când aplicația se oprește. Experiență în utilizare neplăcută. Să rezolvăm asta.
În a noastră viewDidLoad: metoda, trimitem controlorul nostru de vizualizare a loadBookmarks mesaj. Să aruncăm o privire la loadBookmarks metodă. Vom păstra marcajele utilizatorului în baza de date implicite pentru utilizatori. Mai întâi verificăm dacă există deja o intrare în baza de date implicită a utilizatorului cu cheia marcaje
. În acest caz, inițializăm marcajele cu conținutul obiectului stocat. Acesta nu este cazul, vom inițializa marcajele noastre cu o matrice goală mutable și va stoca acea matrice în baza de date implicită a utilizatorului. Simplu. Dreapta?
- (vid) viewDidLoad [super viewDidLoad]; // Încarcă marcajele [bookmarks self];
- (void) loadBookmarks NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; dacă ([ud objectForKey: @ "bookmarks"]! = nil) // Încărcați copia locală self.bookmarks = [NSMutableArray arrayWithArray: [ud objectForKey: @ "bookmarks"]]; altceva // Initialize Bookmarks self.bookmarks = [[NSMutableArray alinia] init]; // Salvează copia locală [ud setObject: self.bookmarks forKey: @ "bookmarks"];
Salvarea marcajelor este chiar mai simplă. Stocăm obiectul de marcaje în baza de date implicită a utilizatorului utilizând tasta marcaje
. Cam despre asta e.
- (void) salvați marcajele NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: auto.bookmarks pentruKey: @ "marcaje"];
A fost destul de mult de lucru. Acum puteți să vă creați și să executați aplicația. Ar trebui să puteți adăuga marcaje și să ștergeți marcajele. Marcajele sunt salvate pe disc, astfel încât să nu pierdeți date când părăsiți aplicația.
Pentru ca aplicația noastră să strălucească într-adevăr, vom folosi iCloud pentru a păstra semnalele noastre sincronizate pe dispozitivele noastre. Te va surprinde cât de ușor este asta. Așa cum am menționat în tutorialul precedent al acestei serii, stocarea cheie-valoare a iCloud funcționează foarte mult NSUserDefaults
, adică, stochează perechi cheie-valoare. În terminologia iCloud, magazinul este numit NSUbiquitousKeyValueStore
. Să începem prin salvarea marcajelor noastre nu numai la nivel local, ci și la iCloud.
Mergeți la noi saveBookmarks: și modificați metoda noastră pentru a arăta ca cea de mai jos. Începem prin a prelua o referință la magazinul implicit prin apelare defaultStore pe NSUbiquitousKeyValueStore
clasă. Din nou, acest lucru este foarte similar cu NSUserDefaults
. Dacă referința noastră la magazin nu este nulă, stocăm obiectul de marcaje din magazin cu aceeași cheie pe care am folosit-o pentru a stoca marcajele noastre în baza de date implicită pentru utilizatori. În cele din urmă, sincronizăm magazinul.
- (void) saveBookmarks // Salvați copia locală NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: auto.bookmarks pentruKey: @ "marcaje"]; // Salvează în iCloud NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; dacă (magazin! = nil) [store setObject: self.bookmarks forKey: @ "bookmarks"]; [stochează sincronizați];
apel sincroniza pe instanța magazinului sincronizează cheile și valorile din memorie cu cele salvate pe disc. S-ar putea să credeți că această metodă forțează orice perechi noi cheie-valoare care trebuie trimise la iCloud, dar acest lucru nu este cazul. Salvând cheile din memorie pe disc, iCloud este anunțat că există noi perechi cheie-valoare disponibile pentru a fi sincronizate. Cu toate acestea, sistemul de operare decide în cele din urmă când este necesar să se sincronizeze perechile nou adăugate cheie-valoare cu iCloud. Acest lucru este important să rețineți și acesta este motivul pentru care modificările efectuate pe un singur dispozitiv nu vor fi vizibile imediat pe un alt dispozitiv.
De asemenea, chiar dacă am sunat sincronizate pe exemplul magazinului, acest lucru nu este necesar în majoritatea situațiilor. Sistemul de operare face acest lucru pentru dvs. la momentele potrivite. Stiai asta NSUserDefaults
are o sincroniza care funcționează aproape identic?
S-ar putea să vă întrebați modul în care aplicația noastră știe când un alt dispozitiv a actualizat Magazinul de valori cheie în iCloud și cum poate să tragă aceste modificări. Aceasta este o întrebare foarte bună și aceasta este ultima piesă a puzzle-ului.
De fiecare dată când magazinul de valori cheie a fost modificat, o notificare este trimisă și cererea noastră se poate înregistra ca obeserver pentru aceste notificări. Este important să vă înregistrați pentru astfel de notificări cât mai curând posibil în ciclul de viață al aplicației.
Să vedem cum funcționează acest lucru. În a noastră viewDidLoad metoda facem patru lucruri. Mai întâi, vom primi o referire la Magazinul de Valori-Valoare. În al doilea rând, adăugăm controlorul nostru de vizualizare ca observator pentru orice notificări cu numele de NSUbiquitousKeyValueStoreDidChangeExternallyNotification
trimis de Magazinul de valori cheie. Când primim o astfel de notificare, vom rezolva această notificare în cadrul nostru updateKeyValuePairs: (pe care o vom scrie într-un moment). Apoi, trimitem un mesaj de la magazin sincroniza. În sfârșit, încărcăm marcajele așa cum am făcut înainte.
- (vid) viewDidLoad [super viewDidLoad]; NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; [[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (updateKeyValuePairs :) nume: NSUbiquitousKeyValueStoreDidChangeExternallyNotification object: store]; // Sincronizați stocarea [stocare sincronizați]; // Încarcă marcajele [bookmarks self];
Tot ce ne rămâne să facem este să implementăm updateKeyValuePairs: metodă. Să facem asta acum. Notificarea este userinfo
dicționarul conține două perechi cheie cheie-valoare, (1) motiv de ce a fost trimisă notificarea și (2) chei din Magazinul de valori cheie ale căror valori s-au schimbat. Începem să examinăm mai atent motivul notificării. Ne asigurăm în primul rând că a fost specificat un motiv și returnat dacă nu a fost specificat nici unul. Dacă a fost specificat un motiv, vom proceda numai dacă motivul a fost fie o schimbare pe server (NSUbiquitousKeyValueStoreServerChange
) sau modificările locale au fost eliminate din cauza unei sincronizări inițiale cu serverul (NSUbiquitousKeyValueStoreInitialSyncChange
). Dacă unul dintre aceste criterii este îndeplinit, scoatem cheia de chei care s-a modificat și iterăm peste chei pentru a vedea dacă cheia de marcaje se află printre ele. Dacă este cazul, luăm valoarea asociată cheii și actualizăm sursa de date, precum și baza de date implicită a utilizatorului cu această valoare. În cele din urmă, reîncărcați vizualizarea tabelului pentru a reflecta modificările.
- (void) updateKeyValuePairs: (NSNotification *) notificare NSDictionary * userInfo = [notification userInfo]; NSNumber * changeReason = [utilizatorInfo obiectForKey: NSUbiquitousKeyValueStoreChangeReasonKey]; Motivul NSInteger = -1; // Este specificat un motiv? dacă (! changeReason) return; altceva reason = [changeReason integerValue]; // Continuați dacă motivul a fost (1) Schimbări pe server sau (2) Sincronizare inițială dacă ((motiv == NSUbiquitousKeyValueStoreServerChange) || (motiv == NSUbiquitousKeyValueStoreInitialSyncChange)) NSArray * changedKeys = [userInfo objectForKey: NSUbiquitousKeyValueStoreChangedKeysKey]; NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; // Chei de căutare pentru "marcajele" Cheie pentru (tasta NSString * în keyKeys) if ([cheie esteEqualToString: @ "bookmarks"]) // Update Sursa de date self.bookmarks = [NSMutableArray arrayWithArray: [store objectForKey: ]; // Salvați copia locală NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: auto.bookmarks pentruKey: @ "marcaje"]; // Reîncarcă tabelul [self.tableView reloadData];
Există două puncte care necesită o atenție deosebită. În primul rând, după cum am văzut în punerea în aplicare a updateKeyValuePairs:, primim o matrice care conține toate cheile din Magazinul de valori cheie cu valori care au fost modificate. Aceasta este o opimizare pentru a împiedica iCloud să trimită o notificare pentru fiecare pereche cheie-valoare care sa schimbat. În al doilea rând, este foarte recomandat să stocați local toate datele din Magazinul de valori cheie. Baza de date implicită pentru utilizatori este foarte potrivită pentru acest scop, dar sunteți liber să alegeți soluția potrivită nevoilor dvs. Motivul pentru stocarea unei copii locale este să nu se bazeze pe iCloud pentru stocarea datelor. Nu fiecare utilizator va avea un cont iCloud sau va avea activat iCloud pe dispozitivul său.
Cu această ultimă bucată de cod în loc, aplicația noastră este acum activată de iCloud. Construiți și rulați aplicația pe două dispozitive și încercați-o singură. Rețineți că modificările nu sunt instantanee. Modificările trebuie sincronizate cu serverele iCloud și ulterior trimise la dispozitivele corespunzătoare care necesită actualizare.
Chiar dacă acest tuturial este lung, implementarea iCloud Key-Value Storage nu necesită prea mult cod suplimentar. Așa cum am scris în tutorialul precedent, adoptarea memoriei cheie-valoare este ușor, simplă și necesită foarte puțină cheltuială din partea dvs..
Înainte de a încheia acest tutorial, vreau să reiterez argumentele pro și contra ale soluției iCloud Key-Value Storage, deoarece acestea sunt importante pentru a păstra în minte. Profesioniștii sunt deja evidenti, este ușor de adoptat, rapid de pus în aplicare și seamănă foarte mult cu modul în care NSUserDefaults
lucrări. Cu toate acestea, este, de asemenea, important să țineți mintea în evidență. Perechile cheie-valoare sunt ceea ce sunt. Adică, perechi simple, fără nici o formă de manevrare a conflictelor, decât dacă implementați propria logică de gestionare a conflictelor. Acesta din urmă nu este recomandat deoarece nu a fost construită o cheie de stocare în acest sens. Spațiul de stocare a documentelor furnizează suport integrat pentru conflicte și, prin urmare, este o opțiune mult mai bună dacă solicitați rezolvarea conflictelor. În cele din urmă, nu uitați că spațiul de stocare cheie poate salva numai date de 1 MB cu un număr maxim de 1024 de perechi de valori cheie. Chiar dacă am adoptat spațiul de stocare cheie în această aplicație pentru ilustrare, nu putem garanta că nu va exista niciodată un utilizator cu o listă de marcaje care să depășească limita de 1 MB.
De asemenea, vreau să subliniez faptul că scopul aplicației noastre este de a vă arăta cum să adoptați un spațiu de stocare cheie și cum funcționează în spatele scenei. Acest lucru nu este în nici un caz o aplicație care este gata de eliberare, deoarece nu este rezistenta la bullet in mai multe moduri.
În acest tutorial, am învățat cum să configurați o aplicație pentru utilizarea cu iCloud de la Apple. De asemenea, am analizat mai atent stocarea cheie iCloud. În următorul tutorial, ne vom concentra pe celălalt tip de stocare iCloud: Storage Document. Acest tip de stocare iCloud este destinat aplicațiilor grele de date și exact