Mantenere sincronizzati i dati delle applicazioni tra i dispositivi è un compito complesso e scoraggiante. Fortunatamente, questo è esattamente il motivo per cui Apple ha creato iCloud. In questa serie di Tuts + Premium, imparerai come funziona iCloud e come le tue applicazioni possono condividere i dati in modo trasparente su più dispositivi.
Nelle precedenti versioni di questa serie, abbiamo rifattorato la nostra applicazione di esempio per passare da iCloud Key-Value Storage a iCloud Document Storage. Il Document Storage di iCloud è molto più flessibile di Key-Value Storage e quindi più adatto per le applicazioni di dati pesanti. Core Data è un framework di persistenza creato per applicazioni che gestiscono grandi quantità di dati e modelli di dati complessi. Nel corso degli anni, Core Data ha guadagnato le sue strisce ed è noto come un framework affidabile e flessibile per la persistenza dei dati. Questa serie non sarebbe completa senza discutere di Core Data e della sua integrazione con iCloud.
In termini di Core Data, ci sono due tipi di applicazioni, (1) applicazioni basate su documenti e (2) applicazioni in stile libreria. Le applicazioni basate su documenti, come l'applicazione Pagine di Apple, gestiscono i documenti supportati da un archivio di dati di base. Le applicazioni in stile libreria, come l'applicazione musicale incorporata nell'iPhone, utilizzano un singolo archivio persistente utilizzato in tutta l'applicazione.
In questo tutorial, discuterò entrambi i tipi di applicazioni e abbozzerò una panoramica di alto livello su come ogni tipo di applicazione può integrarsi con iCloud. Core Data è un argomento molto ampio e uno degli aspetti più avanzati dello sviluppo Mac e iOS. Questo tutorial tratterà solo la superficie di ciò che è possibile e le opzioni di integrazione disponibili con iCloud.
UIManagedDocument
è una sottoclasse concreta di UIDocument
ed è fatto su misura per soddisfare le esigenze delle applicazioni Core Data basate su documenti. Per le applicazioni basate su documenti, UIManagedDocument
offre il meglio di due mondi, (1) UIDocument
La facilità d'uso e (2) il supporto dati Core integrato. Vale la pena ricordare questo UIManagedDocument
può essere utilizzato anche se non è necessario l'integrazione con iCloud. Nonostante UIManagedDocument
viene spesso citato nel contesto di iCloud, è utile prendere un momento e sottolineare i vantaggi del UIManagedDocument
classe stessa.
Proprio come la sua superclasse, UIDocument
, UIManagedDocument
rende la gestione dei documenti facile e immediata. La differenza principale con UIDocument
è questo UIManagedDocument
è rivolto specificamente a Core Data. Tutti e due UIDocument
e UIManagedDocument
avere molto da offrire fuori dagli schemi. Ricorda dal precedente tutorial che UIDocument
dispone di un salvataggio automatico e le operazioni di caricamento e salvataggio vengono gestite su una coda di background mentre si estrapolano i dettagli nitidi. Se si decide di utilizzare i dati principali in un'applicazione basata su documenti, si consiglia di utilizzare UIManagedDocument
anche se iCloud non è presente nell'elenco delle funzionalità dell'applicazione.
Prima dell'introduzione di UIManagedDocument
, lo stack di Core Data era tradizionalmente impostato e configurato nel delegato dell'applicazione. Questo non è più necessario quando si utilizza UIManagedDocument
. Una delle sottigliezze del UIManagedDocument
class è il suo stack di Core Data integrato. Dopo aver inizializzato un'istanza di UIManagedDocument
, è disponibile uno stack completo di Core Data. UIManagedDocument
L'interfaccia di 's espone un contesto di oggetti gestiti così come il coordinatore di archivio persistente e il modello di oggetto gestito. La configurazione del coordinatore dell'archivio permanente è semplice quanto fornire un dizionario con le opzioni proprio come fai quando si inizializza manualmente un coordinatore di archivio permanente.
Come suggerisce il nome, UIManagedDocument
è una sottoclasse concreta di UIDocument
, il che significa che può essere usato così com'è, senza bisogno di sottoclasse UIDocument
. Dietro le quinte, UIManagedDocument
aggrega automaticamente i modelli di oggetti gestiti che trova nel pacchetto di applicazioni e prepara uno stack di Core Data con cui lavorare. Se la tua applicazione ha requisiti più complessi, spetta a te creare una sottoclasse UIManagedDocument
per soddisfare tali requisiti.
Chiunque abbia familiarità con Core Data sa che tali modifiche sono impegnate nello store persistente inviando il contesto dell'oggetto gestito a salvare: Messaggio. Questo non è più necessario quando si utilizza UIManagedDocument
. Non solo non è necessario, dovrebbe essere evitato. Il motivo è che, sotto il cofano, UIManagedDocument
gestisce un contesto dell'oggetto gestito privato. Questo contesto oggetto gestito privato gestisce un contesto oggetto gestito dall'infanzia, che è il contesto dell'oggetto gestito esposto attraverso UIManagedDocument
L'interfaccia pubblica. Inviando il contesto dell'oggetto gestito da bambino a salvare: messaggio, le modifiche vengono applicate solo al contesto dell'oggetto gestito principale e non all'archivio permanente gestito dal contesto dell'oggetto gestito principale.
In breve, dovresti usare il familiare UIDocument
metodi per salvare le modifiche allo store persistente, il resto è curato dietro le quinte. C'è una ragione per cui UIManagedDocument
eredita da UIDocument
!
Le applicazioni basate su libreria, come le applicazioni di musica e foto incorporate nell'iPhone, di solito gestiscono uno stack di Core Data con un coordinatore di negozio permanente e un archivio permanente.
Potresti chiederti come funziona Core Data con iCloud. Questo dipende dal tipo di negozio che si utilizza, ovvero (1) un SQLite o (2) un archivio binario (atomico). Nella maggior parte dei casi d'uso, si consiglia di optare per SQLite. Tuttavia, se gestisci piccole quantità di dati, anche un'opzione binaria è un'opzione. Alla luce di iCloud, il principale svantaggio di un negozio binario è che ogni modifica comporta la sostituzione dell'intero negozio. Non solo è inefficiente, ma può potenzialmente comportare implicazioni di prestazioni significative se il negozio cresce di dimensioni. Nel resto di questa discussione, mi concentrerò su SQLite come backing store.
Con SQLite come backing store, il vantaggio principale è che le modifiche vengono propagate in modo incrementale invece di sostituire l'intero negozio con ogni cambiamento commesso. Per capire come funzionano Core Data e iCloud è importante sapere che il database SQLite non è memorizzato in iCloud. Invece, ogni cambiamento è registrato nel cosiddetto registri delle transazioni e quei registri sono usati per propagare le modifiche attraverso i dispositivi. I registri delle transazioni sono leggeri e generano un processo di sincronizzazione a grana fine, rapido ed efficiente. I registri delle transazioni sono memorizzati in una directory nel contenitore iCloud. La posizione esatta può essere specificata impostando il NSPersistentStoreUbiquitousContentURLKey
digitare il dizionario delle opzioni passato al coordinatore del negozio permanente.
Un altro aspetto vitale della sincronizzazione è mantenere l'interfaccia utente aggiornata. Quando si utilizza Core Data, ciò può essere ottenuto registrando i controller appropriati come osservatore per NSPersistentStoreDidImportUbiquitousContentChangesNotification
notifiche, che vengono inviate ogni volta che viene propagata una modifica remota. In base alle modifiche, l'applicazione può aggiornare l'interfaccia utente in modo che rifletta le modifiche apportate al suo archivio persistente locale.
Un altro vantaggio chiave di Core Data è il controllo granulare che si ha sui dati e questo è particolarmente vero per quanto riguarda la fusione dei dati, una parte essenziale del lavoro con iCloud. Grazie a questa granularità, che è possibile solo grazie all'utilizzo dei log delle transazioni, la maggior parte della fusione viene eseguita automaticamente da Core Data.
Il filo conduttore di questa serie è stato il modo in cui le tue applicazioni possono beneficiare di iCloud e di come integrarsi con iCloud. Voglio terminare questa serie esponendo alcune avvertenze a cui potresti voler prestare attenzione quando aggiungi il supporto iCloud a un'applicazione. Nella seconda e terza parte di questa serie, ti ho mostrato come usare NSFileManager
'S URLForUbiquityContainerIdentifier: metodo per ottenere un riferimento a un contenitore iCloud specifico per la memorizzazione dei dati in iCloud. Nei nostri esempi, abbiamo sempre pensato che iCloud fosse abilitato sui dispositivi con cui lavoravamo, ma
questo non sarà sempre il caso. È quindi importante disporre di una soluzione alternativa per le situazioni in cui iCloud non è abilitato. Di seguito sono riportati due esempi per illustrare meglio questi avvertimenti.
Il primo esempio è quando un utente non ha un account iCloud o non ha eseguito l'accesso con il suo account iCloud sul dispositivo. Ciò significa che l'applicazione non è in grado di accedere al contenitore iCloud in cui intende memorizzare i dati. Diventa ancora più complesso quando abilita iCloud dopo aver utilizzato l'applicazione per alcune settimane. L'utente si aspetta che i suoi dati siano sincronizzati tra i suoi dispositivi. In altre parole, è necessario un modo per trasferire i dati dalla sandbox dell'applicazione al contenitore iCloud.
Il secondo esempio si concentra sulla persistenza dei dati. Cosa succede quando un utente ha abilitato iCloud sul suo dispositivo, ma decide dopo alcune settimane di accedere con un altro account iCloud? I dati memorizzati nel contenitore iCloud non sono più disponibili per l'utente poiché viene utilizzato un account iCloud diverso. Questa è una misura di sicurezza messa in atto da Apple. I dati sono collegati a un account iCloud, non a un dispositivo. Pertanto, i dati non sono accessibili quando viene utilizzato un account iCloud differente. È raro che un utente abbia più account iCloud, ma è importante essere consapevoli di questa possibilità e delle conseguenze che può avere.
Spero che questa serie su iCloud ti abbia dato una buona idea di cosa sia iCloud e cosa può fare per te come sviluppatore. L'idea di base di iCloud è semplice e l'adozione di iCloud è relativamente semplice se il modello di dati dell'applicazione non è troppo complesso. Tuttavia, questa installazione finale ha dimostrato che l'integrazione di iCloud può diventare molto complessa quando aumenta la complessità del modello di dati dell'applicazione.