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 tranșele anterioare din această serie, am reconfacturat aplicația noastră de eșantionare pentru a comuta de la stocarea cheie iCloud Key-Value la iCloud Document Storage. Stocarea documentelor iCloud este mult mai flexibilă decât stocarea cheie-valoare și, prin urmare, mai potrivită pentru aplicațiile grele de date. Core Data este un cadru de persistență construit pentru aplicații care gestionează cantități mari de date și modele complexe de date. De-a lungul anilor, Core Data și-a câștigat dungile și este cunoscut ca un cadru fiabil și flexibil pentru persistența datelor. Această serie nu ar fi completă fără a discuta Core Data și integrarea sa cu iCloud.
În ceea ce privește datele de bază, există două tipuri de aplicații, (1) aplicații bazate pe documente și (2) aplicații în bibliotecă. Aplicațiile bazate pe documente, cum ar fi aplicația Pages of Apple, gestionează documentele susținute de un magazin de date de bază. Aplicațiile în stilul bibliotecii, cum ar fi aplicația muzicală încorporată a iPhone-ului, utilizează un singur magazin persistent care este utilizat în întreaga aplicație.
În acest tutorial, voi discuta ambele tipuri de aplicații și voi schița o prezentare generală a modului în care fiecare tip de aplicație se poate integra cu iCloud. Datele de bază reprezintă un subiect foarte larg și unul dintre aspectele mai avansate ale dezvoltării Mac și iOS. Acest tutorial va zgâria doar suprafața a ceea ce este posibil și opțiunile de integrare disponibile cu iCloud.
UIManagedDocument
este o subclasă concretă de UIDocument
și este adaptat pentru a satisface nevoile aplicațiilor bazate pe date bazate pe documente. Pentru aplicațiile bazate pe documente, UIManagedDocument
oferă cele mai bune din cele două lumi, (1) UIDocument
(2) suport de date încorporat. Este demn de menționat acest lucru UIManagedDocument
pot fi utilizate chiar dacă nu este nevoie de integrarea iCloud. Chiar dacă UIManagedDocument
este adesea menționată în contextul "iCloud", este util să se ia o clipă și să se sublinieze beneficiile UIManagedDocument
clasa însăși.
La fel ca superclajul său, UIDocument
, UIManagedDocument
face managementul documentelor ușor și simplu. Diferența cheie cu UIDocument
este asta UIManagedDocument
se adresează în mod specific datelor de bază. Ambii UIDocument
și UIManagedDocument
au multe de oferit din cutie. Rețineți din tutorialul anterior că UIDocument
oferă funcții de salvare automată și operațiile de încărcare și de salvare sunt tratate pe o coadă de fundal, în timp ce se abstracționează detaliile zgomotoase. Dacă decideți să utilizați datele de bază într-o aplicație bazată pe documente, se recomandă utilizarea acestora UIManagedDocument
chiar dacă iCloud nu se află pe lista de caracteristici a aplicației dvs..
Înainte de introducerea UIManagedDocument
, setul de date de bază a fost configurat și configurat în mod tradițional în delegatul aplicației. Acest lucru nu mai este necesar atunci când îl utilizați UIManagedDocument
. Una dintre frumusețile lui UIManagedDocument
clasa este încorporată în stiva de date de bază. După inițializarea unei instanțe din UIManagedDocument
, este disponibil un stiva complet de date de bază. UIManagedDocument
interfața expune un context de obiecte gestionate, precum și coordonatorul de magazin persistent și modelul de obiect gestionat. Configurarea coordonatorului de stocare persistentă este la fel de ușor ca și furnizarea unui dicționar cu opțiuni la fel ca și când faci inițializarea manuală a unui coordonator de magazin persistent.
După cum sugerează și numele, UIManagedDocument
este o subclasă concretă de UIDocument
, ceea ce înseamnă că poate fi folosit ca atare, fără a fi nevoie de subclasă UIDocument
. În spatele scenelor, UIManagedDocument
agregă automat modelele de obiecte gestionate pe care le găsește în pachetul de aplicații și pregătește o stivă de date de bază cu care să lucrați. Dacă cererea dvs. are cerințe mai complexe, atunci depinde de subclasa UIManagedDocument
pentru a îndeplini aceste cerințe.
Oricine este familiarizat cu datele de bază știe că schimbările se angajează la stocarea persistentă prin trimiterea contextului obiect gestionat a Salvați: mesaj. Acest lucru nu mai este necesar atunci când îl utilizați UIManagedDocument
. Nu numai că acest lucru nu este necesar, ci trebuie evitat. Motivul este că, sub capotă, UIManagedDocument
gestionează un context de obiecte private gestionate. Acest context privat gestionat obiect gestionează un context de obiecte gestionate copil, care este expus contextul de obiecte gestionate UIManagedDocument
interfata publica. Prin trimiterea contextului obiect gestionat copil a Salvați: mesaj, modificările se angajează numai în contextul obiect gestionat părinte și nu în magazinul persistent care este gestionat de contextul obiect gestionat părinte.
Pe scurt, ar trebui să utilizați familia UIDocument
metode pentru a salva modificările la magazinul persistent, restul este îngrijit în spatele scenei. Există un motiv pentru asta UIManagedDocument
moștenește de la UIDocument
!
Aplicațiile bazate pe bibliotecă, cum ar fi aplicațiile de muzică și fotografii încorporate de iPhone, gestionează, de obicei, o stivă de date core cu un singur coordonator permanent de magazin și un magazin persistent.
S-ar putea să te întrebi cum funcționează Core Data cu iCloud sub capotă. Acest lucru depinde de tipul de magazin pe care îl utilizați, adică (1) un SQLite sau (2) un magazin binar (atomic). În majoritatea cazurilor de utilizare, se recomandă opțiunea pentru SQLite. Cu toate acestea, dacă aveți de a face cu cantități mici de date atunci un magazin binar este o opțiune, de asemenea. În lumina lui iCloud, dezavantajul major al unui magazin binar este că fiecare schimbare duce la înlocuirea întregului magazin. Nu numai că acest lucru este ineficient, ci poate duce la implicații semnificative de performanță dacă magazinul crește în dimensiune. În restul discuțiilor, mă voi concentra pe SQLite ca magazin de suport.
Cu SQLite ca magazin de suport, avantajul major este acela că schimbările sunt propagate progresiv, în loc să înlocuiască întregul magazin cu fiecare schimbare angajată. Pentru a înțelege cum funcționează împreună datele core și iCloud, este important să știm că baza de date SQLite nu este stocată în iCloud. În schimb, fiecare schimbare este înregistrată în așa-numitele înregistrări de tranzacții iar acele jurnale sunt folosite pentru a propaga modificările de pe toate dispozitivele. Jurnalele de tranzacții sunt ușoare și duc la un proces de sincronizare cu granulație fină, rapidă și eficientă. Jurnalele de tranzacții sunt stocate într-un director din containerul iCloud. Locația exactă poate fi specificată prin setarea NSPersistentStoreUbiquitousContentURLKey
tastați în dicționarul de opțiuni transmis coordonatorului permanent de magazin.
Un alt aspect vital al sincronizării este menținerea actualizării interfeței utilizator. Când se utilizează datele de bază, acest lucru poate fi realizat prin înregistrarea controlorilor corespunzători ca observator NSPersistentStoreDidImportUbiquitousContentChangesNotification
notificări, care sunt trimise ori de câte ori o schimbare la distanță este propagată. Pe baza modificărilor, aplicația dvs. poate actualiza interfața cu utilizatorul pentru a reflecta modificările aduse memoriei sale locale persistente.
Un alt avantaj cheie al datelor de bază este controlul granular pe care îl aveți asupra datelor dvs. și acest lucru este valabil mai ales în ceea ce privește datele fuzionate, o parte esențială a colaborării cu iCloud. Datorită acestei granularități, care este posibilă numai datorită utilizării jurnalelor de tranzacții, cea mai mare parte a fuziunii se face automat de către Core Data.
Firele comune din această serie au fost modul în care aplicațiile dvs. pot beneficia de iCloud și cum să se integreze cu iCloud. Vreau să închei această serie expunând câteva avertismente pe care ați putea dori să le urmăriți atunci când adăugați suportul iCloud unei aplicații. În cea de-a doua și a treia tranșă din această serie, ți-am arătat cum să folosești NSFileManager
„s URLForUbiquityContainerIdentifier: pentru a obține o referință la un container specific iCloud pentru stocarea datelor în iCloud. În exemplele noastre, am presupus întotdeauna că iCloud a fost activat pe dispozitivele cu care am lucrat, dar
acest lucru nu va fi întotdeauna cazul. Prin urmare, este important să avem o soluție alternativă pentru situațiile în care iCloud nu este activat. Mai jos sunt două exemple pentru a ilustra mai bine aceste restricții.
Primul exemplu este atunci când un utilizator nu are un cont iCloud sau nu sa conectat cu contul iCloud pe dispozitiv. Aceasta înseamnă că aplicația dvs. nu poate accesa containerul iCloud pe care intenționează să îl stocheze. Ea devine și mai complexă atunci când permite iCloud după ce a folosit aplicația dvs. pentru câteva săptămâni. Utilizatorul va aștepta ca datele sale să fie sincronizate pe toate dispozitivele. Cu alte cuvinte, veți avea nevoie de o modalitate de a transfera datele din cutia de cerneală a aplicației în containerul iCloud.
Al doilea exemplu se concentrează pe persistența datelor. Ce se întâmplă când un utilizator a activat iCloud pe dispozitivul său, dar decide după câteva săptămâni să se conecteze cu un alt cont iCloud? Datele stocate în containerul iCloud nu mai sunt disponibile pentru utilizator, deoarece este utilizat un alt cont iCloud. Aceasta este o măsură de securitate pusă în aplicare de Apple. Datele sunt legate de un cont iCloud, nu de un dispozitiv. Prin urmare, datele nu sunt accesibile atunci când se utilizează un alt cont iCloud. Este rar că un utilizator are mai multe conturi iCloud, dar este important să fiți conștienți de această posibilitate și de consecințele pe care le poate avea.
Sper că această serie despre iCloud ți-a dat o idee bună despre ce este iCloud și ce poate face pentru tine ca dezvoltator. Ideea de bază din spatele iCloud este simplă și adoptarea iCloud este relativ ușoară dacă modelul de date al aplicației nu este prea complex. Cu toate acestea, această ultimă tranșă a arătat că integrarea iCloud poate deveni foarte complexă atunci când crește complexitatea modelului de date al aplicației.