Att hålla applikationsdata synkroniserad över enheter är en komplex och skrämmande uppgift. Lyckligtvis är det precis därför Apple byggde iCloud. I denna Tuts + Premium-serie kommer du att lära dig hur iCloud fungerar och hur dina applikationer kan dela data på flera enheter sömlöst.
I de tidigare delarna av den här serien har vi refactored vår sampleapplikation för att växla från iCloud Key Value Storage till iCloud Document Storage. iClouds dokumentlagring är mycket mer flexibel än Key Value Storage och är därför bättre lämpad för data tunga applikationer. Core Data är ett persistensramverk byggt för applikationer som hanterar stora mängder data och komplexa datamodeller. Under åren har Core Data fått sina ränder och är känd som en pålitlig och flexibel ram för data-persistens. Denna serie skulle inte vara komplett utan att diskutera Core Data och dess integration med iCloud.
När det gäller Core Data finns det två typer av applikationer, (1) dokumentbaserade applikationer och (2) program i bibliotekstil. Dokumentbaserade applikationer, till exempel Apples sidans program, hantera dokument som stöds av en Core Data Store. Program i bibliotekstil, som iPhone: s inbyggda musikprogram, använder sig av en enda beständig butik som används i hela applikationen.
I den här handledningen diskuterar jag båda programtyperna och skisserar en överblick över hur varje applikationstyp kan integreras med iCloud. Kärndata är ett mycket brett ämne och en av de mer avancerade aspekterna av Mac och IOS-utveckling. Denna handledning kommer bara att skrapa ytan av vad som är möjligt och integrationsalternativen är tillgängliga med iCloud.
UIManagedDocument
är en konkret underklass av UIDocument
och skräddarsys för att passa behoven hos dokumentbaserade Core Data-applikationer. För dokumentbaserade applikationer, UIManagedDocument
erbjuder det bästa av två världar, (1) UIDocument
användarvänlighet och (2) inbyggd Core Data support. Det är värt att nämna det UIManagedDocument
kan användas även om det inte finns något behov av iCloud integration. Även om UIManagedDocument
nämns ofta i samband med iCloud, det är användbart att ta en stund och understryka fördelarna med UIManagedDocument
klassen själv.
Precis som dess superklass, UIDocument
, UIManagedDocument
gör dokumenthanteringen enkel och okomplicerad. Nyckelfaktorn med UIDocument
är det UIManagedDocument
riktar sig specifikt till Core Data. Både UIDocument
och UIManagedDocument
har mycket att erbjuda ur lådan. Kom ihåg från den tidigare handledningen det UIDocument
funktioner automatisk sparning, och lastning och spara operationer hanteras i en bakgrundskö och drar bort de nitty gritty detaljerna. Om du väljer att använda Core Data i en dokumentbaserad applikation, rekommenderas att använda UIManagedDocument
även om iCloud inte finns på din programmets funktionslista.
Innan introduktionen av UIManagedDocument
, Core Data stacken har traditionellt ställts in och konfigurerats i applikationsdelegatet. Detta är inte längre nödvändigt när du använder UIManagedDocument
. En av nicetiesna av UIManagedDocument
klassen är den inbyggda Core Data stacken. Efter initialisering av en instans av UIManagedDocument
, En komplett Core Data stack är tillgänglig för dig. UIManagedDocument
s gränssnitt exponerar ett hanterat objekt sammanhang samt den ihållande butikskoordinatorn och den hanterade objektmodellen. Konfigurera den bestående butikskoordinatorn är lika lätt som att leverera en ordbok med alternativ precis som du gör när du manuellt initierar en bestående butikskoordinator.
Som namnet antyder, UIManagedDocument
är en konkret underklass av UIDocument
, vilket innebär att det kan användas som det är utan att behöva subklass UIDocument
. Bakom kulisserna, UIManagedDocument
samlar automatiskt hanterade objektmodeller som den hittar i din applikationspaket och förbereder en Core Data-stack för att du ska arbeta med. Om din ansökan har mer komplexa krav är det upp till dig att delklassera UIManagedDocument
för att uppfylla dessa krav.
Någon som är bekant med Core Data vet att de förändringarna är förpliktade till den bestående affären genom att skicka det hanterade objektets kontext a spara: meddelande. Detta är inte längre nödvändigt när du använder UIManagedDocument
. Detta är inte bara nödvändigt, det bör undvikas. Anledningen är att under huven, UIManagedDocument
hanterar en privat hanterad objektkontext. Det här kontextet för privat hanterat objekt hanterar ett kontext för barn hanterat objekt, vilket är det hanterade objektets sammanhang som exponeras genom UIManagedDocument
s offentliga gränssnitt. Genom att skicka barnets hanterade objektkontext a spara: meddelandet är ändringarna endast kopplade till det moderna hanterade objektet och inte till den ihållande butiken som hanteras av kontexten för förvaltad objekt.
Kort sagt, du borde använda det bekanta UIDocument
metoder för att spara ändringar i den ihållande affären, resten tas hand om bakom kulisserna. Det finns en anledning till varför UIManagedDocument
ärver från UIDocument
!
Biblioteksbaserade applikationer, till exempel iPhone: s inbyggda musik- och bildapplikationer, hanterar vanligtvis en Core Data-stack med en bestående butikskoordinator och en ihållande butik.
Du kanske undrar hur Core Data fungerar med iCloud under huven. Det beror på vilken typ av butik du använder, det vill säga (1) en SQLite eller (2) en binär (atomär) butik. I de flesta användningsfall rekommenderas det att välja SQLite. Men om du hanterar små mängder data är en binär butik också ett alternativ. I ljuset av iCloud är den stora nackdelen med en binär butik att varje förändring resulterar i att hela butiken ersätts. Det är inte bara detta ineffektivt, det kan potentiellt leda till betydande prestationseffekter om butiken växer i storlek. I resten av denna diskussion kommer jag att fokusera på SQLite som backing-butik.
Med SQLite som backing-butik är den stora fördelen att förändringar förökas stegvis istället för att ersätta hela butiken med varje engagerad förändring. För att förstå hur Core Data och iCloud arbetar tillsammans är det viktigt att veta att SQLite-databasen inte lagras i iCloud. Istället är varje ändring registrerad i så kallad transaktionsloggar och de loggarna används för att sprida förändringar över enheter. Transaktionsloggen är lätt och resulterar i en finkorrigerad, snabb och effektiv synkroniseringsprocess. Transaktionsloggarna lagras i en katalog i iCloud-behållaren. Den exakta platsen kan anges genom att ställa in NSPersistentStoreUbiquitousContentURLKey
nyckel i alternativordlistan skickad till den ihållande butikskoordinatorn.
En annan viktig aspekt av synkroniseringen är att hålla användargränssnittet uppdaterat. Vid användning av Core Data kan detta uppnås genom att registrera lämpliga controllers som observatör för NSPersistentStoreDidImportUbiquitousContentChangesNotification
meddelanden som skickas när en fjärrändring förökas. Baserat på ändringarna kan din applikation uppdatera användargränssnittet för att återspegla de förändringar som har gjorts till den lokala ihållande butiken.
En annan viktig fördel med Core Data är den granulära kontrollen du har över dina data, och det är särskilt sant med avseende på sammanslagning av data, en viktig del av arbetet med iCloud. Tack vare denna granularitet, vilket endast är möjligt tack vare användningen av transaktionsloggar, görs det mesta av sammanslagningen automatiskt av Core Data.
Den vanliga tråden i hela serien har varit hur dina applikationer kan dra nytta av iCloud och hur man integrerar med iCloud. Jag vill avsluta den här serien genom att avslöja några försiktighetsåtgärder som du kanske vill se upp när du lägger till iCloud-stöd till en applikation. I den andra och tredje delen av denna serie visade jag dig hur man använder NSFileManager
's URLForUbiquityContainerIdentifier: Metod för att få en referens till en specifik iCloud-behållare för lagring av data i iCloud. I våra exempel antog vi alltid att iCloud var aktiverat på de enheter vi arbetade med, men
Detta kommer inte alltid vara fallet. Det är därför viktigt att ha en återgångslösning på plats för situationer när iCloud inte är aktiverat. Nedan följer två exempel för att bättre illustrera dessa försiktighetsåtgärder.
Det första exemplet är när en användare inte har ett iCloud-konto eller hon inte har loggat in med sitt iCloud-konto på enheten. Det innebär att din ansökan inte kan komma åt iCloud-behållaren som den avser att lagra data i. Det blir ännu mer komplext när hon aktiverar iCloud efter att ha använt din ansökan i några veckor. Användaren förväntar sig att hennes data ska synkroniseras över sina enheter. Med andra ord behöver du ett sätt att överföra data från applikationssandboxen till iCloud-behållaren.
Det andra exemplet fokuserar på datasistens. Vad händer när en användare har aktiverat iCloud på sin enhet, men beslutar efter några veckor att logga in med ett annat iCloud-konto? Data som lagras i iCloud-behållaren är inte längre tillgänglig för användaren eftersom ett annat iCloud-konto används. Detta är en säkerhetsåtgärd som Apple har infört. Data kopplas till ett iCloud-konto, inte till en enhet. Uppgifterna är därför inte tillgängliga när ett annat iCloud-konto används. Det är sällsynt att en användare har flera iCloud-konton, men det är viktigt att vara medveten om denna möjlighet och konsekvenserna det kan ha.
Jag hoppas att den här serien om iCloud har gett dig en bra uppfattning om vad ICloud är och vad det kan göra för dig som utvecklare. Den grundläggande idén bakom iCloud är enkel och att anta iCloud är relativt lätt om din applikations datamodell inte är för komplex. Denna slutliga avbetalning har dock visat att iCloud-integration kan bli väldigt komplex när komplexiteten i din applikations datamodell ökar.