Å holde applikasjonsdata synkronisert på tvers av enheter er en komplisert og skremmende oppgave. Heldigvis er det akkurat hvorfor Apple bygget iCloud. I denne Tuts + Premium-serien lærer du hvordan iCloud fungerer, og hvordan programmene dine kan sømløst dele data på flere enheter.
I de forrige delene av denne serien, refactored vi vårt eksempelprogram for å bytte fra iCloud Key-Value Storage til iCloud Document Storage. iClouds dokumentlagring er mye mer fleksibel enn nøkkelverdi lagring og er derfor bedre egnet for datatunge applikasjoner. Core Data er et persistensramme bygget for applikasjoner som håndterer store mengder data og komplekse datamodeller. Gjennom årene har Core Data oppnådd sine striper og er kjent som et pålitelig og fleksibelt rammeverk for datautholdenhet. Denne serien ville ikke være fullstendig uten å diskutere Core Data og integrasjonen med iCloud.
Når det gjelder Core Data, er det to typer applikasjoner, (1) dokumentbaserte applikasjoner og (2) bibliotekstil applikasjoner. Dokumentbaserte applikasjoner, som Apples Pages-applikasjon, administrerer dokumenter støttet av en Core Data-butikk. Programmer i biblioteksstil, som iPhones innebygde musikkprogram, benytter en enkelt vedvarende butikk som brukes i hele applikasjonen.
I denne veiledningen vil jeg diskutere begge applikasjonstyper og skissere et høyt nivå overblikk over hvordan hver applikasjonstype kan integrere med iCloud. Kjernedata er et meget bredt emne og en av de mer avanserte aspektene av Mac og IOS-utvikling. Denne opplæringen vil bare skrape overflaten av det som er mulig og integrasjonsalternativene er tilgjengelige med iCloud.
UIManagedDocument
er en konkret underklasse av UIDocument
og er skreddersydd for å passe til behovene til dokumentbaserte Core Data applikasjoner. For dokumentbaserte applikasjoner, UIManagedDocument
tilbyr det beste av to verdener, (1) UIDocument
brukervennlighet og (2) innebygd Core Data-støtte. Det er verdt å nevne det UIManagedDocument
kan brukes selv om det ikke er behov for iCloud-integrasjon. Selv om UIManagedDocument
er ofte nevnt i sammenheng med iCloud, det er nyttig å ta et øyeblikk og understreke fordelene med UIManagedDocument
klassen selv.
Akkurat som sin superklasse, UIDocument
, UIManagedDocument
gjør dokumenthåndtering enkelt og greit. Nøkkelen forskjellen med UIDocument
er det UIManagedDocument
er rettet spesielt mot Core Data. Både UIDocument
og UIManagedDocument
har mye å by på ut av boksen. Husk fra den forrige opplæringen at UIDocument
funksjoner automatisk lagring, og lasting og lagring av operasjoner håndteres på en bakgrunnskø mens du trekker bort de nitty gritty detaljene. Hvis du bestemmer deg for å bruke Core Data i et dokumentbasert program, anbefales det å bruke UIManagedDocument
selv om iCloud ikke er på programmets funksjonsliste.
Før innføringen av UIManagedDocument
, Core Data stacken ble tradisjonelt satt opp og konfigurert i applikasjonsdelegatet. Dette er ikke lenger nødvendig når du bruker UIManagedDocument
. En av nicetiene til UIManagedDocument
klassen er den innebygde Core Data-stakken. Etter initialisering av en forekomst av UIManagedDocument
, En komplett Core Data stack er tilgjengelig for deg. UIManagedDocument
grensesnittet viser en kontekst for administrert objekt, samt den vedvarende butikkoordinatoren og den administrerte objektmodellen. Konfigurere den vedvarende butikkoordinatoren er like enkelt som å levere en ordbok med alternativer akkurat som du gjør når du manuelt starter en vedvarende butikkoordinator.
Som navnet tilsier, UIManagedDocument
er en konkret underklasse av UIDocument
, noe som betyr at den kan brukes som det er uten behov for underklasse UIDocument
. Bak scenen, UIManagedDocument
Automatiserer automatisk administrerte objektmodeller som den finner i applikasjonspakken og forbereder en Core Data-stabel for at du skal jobbe med. Hvis søknaden din har mer komplekse krav, er det opp til deg å være underklasse UIManagedDocument
for å møte disse kravene.
Alle som er kjent med Core Data, vet at de endringene er forpliktet til den vedvarende butikken ved å sende kontekst a lagre: budskap. Dette er ikke lenger nødvendig når du bruker UIManagedDocument
. Ikke bare er dette ikke nødvendig, det bør unngås. Årsaken er at under hetten, UIManagedDocument
administrerer en privat administrert objekt-kontekst. Denne konteksten med privat styrt objekt håndterer en kontekst for barnet administrert objekt, som er den administrerte objektkonteksten som er eksponert gjennom UIManagedDocument
s offentlige grensesnitt. Ved å sende kontekst til barnets klare objekt a lagre: meldingen, endringene er bare forpliktet til konteksten for foreldreforvaltet objekt og ikke til den vedvarende butikken som forvaltes av konteksten for foreldreforvaltet objekt.
Kort sagt, bør du bruke det kjente UIDocument
metoder for å lagre endringer i den vedvarende butikken, resten blir tatt vare på bak kulissene. Det er en grunn til hvorfor UIManagedDocument
arver fra UIDocument
!
Biblioteksbaserte applikasjoner, som iPhones innebygde musikk- og bildeprogrammer, administrerer vanligvis en Core Data-stabel med en vedvarende butikkoordinator og en vedvarende butikk.
Du lurer kanskje på hvordan Core Data fungerer med iCloud under hetten. Dette avhenger av hvilken type butikk du bruker, det vil si, (1) en SQLite eller (2) en binær (atomisk) butikk. I de fleste brukssaker anbefales det å velge SQLite. Men hvis du håndterer små mengder data, så er en binær butikk et alternativ også. I lys av iCloud er den store ulempen ved en binær butikk at hver forandring resulterer i at hele butikken blir erstattet. Ikke bare er dette ineffektivt, det kan potensielt føre til betydelige ytelsesimplikasjoner hvis butikken vokser i størrelse. I resten av denne diskusjonen vil jeg fokusere på SQLite som backing store.
Med SQLite som backing-butikk, er den store fordelen at endringer forplanteres trinnvis i stedet for å erstatte hele butikken med hver forpliktet endring. For å forstå hvordan Core Data og iCloud jobber sammen, er det viktig å vite at SQLite-databasen ikke er lagret i iCloud. I stedet er alle endringer registrert i såkalte transaksjonslogger og disse loggene brukes til å formidle endringer på tvers av enheter. Transaksjonsloggene er lette og resulterer i en finkorrigert, rask og effektiv synkroniseringsprosess. Transaksjonsloggene lagres i en katalog i iCloud-beholderen. Den nøyaktige plasseringen kan spesifiseres ved å sette inn NSPersistentStoreUbiquitousContentURLKey
tast inn alternativordboken som er sendt til den vedvarende butikkoordinatoren.
Et annet viktig aspekt ved synkronisering er å holde brukergrensesnittet oppdatert. Når du bruker Core Data, kan dette oppnås ved å registrere de aktuelle kontrollerne som observatør for NSPersistentStoreDidImportUbiquitousContentChangesNotification
varsler, som sendes når en fjern endring er forplantet. Basert på endringene, kan søknaden din oppdatere brukergrensesnittet for å gjenspeile endringene som er forpliktet til den lokale, vedvarende butikken.
En annen viktig fordel ved Core Data er den granulære kontrollen du har over dataene dine, og dette gjelder spesielt med hensyn til sammenslåing av data, en viktig del av arbeidet med iCloud. Takket være denne granulariteten, som bare er mulig takket være bruken av transaksjonslogger, gjøres det meste av sammenslåingen automatisk av Core Data.
Den vanlige tråden i hele denne serien har vært hvordan dine applikasjoner kan ha nytte av iCloud og hvordan du integrerer med iCloud. Jeg vil avslutte denne serien ved å avsløre noen advarsler som du kanskje vil passe på når du legger til iCloud-støtte til et program. I den andre og tredje delen av denne serien viste jeg deg hvordan du bruker NSFileManagers
's URLForUbiquityContainerIdentifier: metode for å få en referanse til en bestemt iCloud-beholder for lagring av data i iCloud. I våre eksempler antok vi alltid at iCloud var aktivert på enhetene vi jobbet med, men
Dette vil ikke alltid være tilfelle. Det er derfor viktig å ha en tilbakekallingsløsning på plass for situasjoner når iCloud ikke er aktivert. Nedenfor er to eksempler for å bedre illustrere disse forbeholdene.
Det første eksempelet er når en bruker ikke har en iCloud-konto, eller hun har ikke logget på med sin iCloud-konto på enheten. Dette betyr at søknaden din ikke kan få tilgang til iCloud-beholderen, den har til hensikt å lagre data i. Det blir enda mer komplisert når hun aktiverer iCloud etter å ha brukt programmet i noen uker. Brukeren vil forvente at hennes data skal synkroniseres på tvers av enhetene. Med andre ord trenger du en måte å overføre dataene fra applikasjons sandboken til iCloud-beholderen.
Det andre eksempelet fokuserer på data utholdenhet. Hva skjer når en bruker har aktivert iCloud på enheten, men bestemmer etter noen uker å logge på med en annen iCloud-konto? Dataene som er lagret i iCloud-beholderen, er ikke lenger tilgjengelige for brukeren, siden en annen iCloud-konto brukes. Dette er et sikkerhetsmål som Apple har satt på plass. Data er koblet til en iCloud-konto, ikke til en enhet. Dataene er derfor ikke tilgjengelige når en annen iCloud-konto brukes. Det er sjelden at en bruker har flere iCloud-kontoer, men det er viktig å være oppmerksom på denne muligheten og konsekvensene det kan ha.
Jeg håper at denne serien om iCloud har gitt deg en god ide om hva ICloud er og hva det kan gjøre for deg som utvikler. Den grunnleggende ideen bak iCloud er enkel, og vedtaket av iCloud er relativt enkelt hvis søknadens datamodell ikke er for komplisert. Denne siste avdrag har imidlertid vist at iCloud-integrasjon kan bli svært komplisert når kompleksiteten i søknadens datamodell øker.