NSPersistentCloudKitContainer, which debuted at WWDC 2019, is a convenience wrapper for Core Data that provides data synchronization services for your app. CloudKit is Apple’s backend as a service (BaaS), based on the iCloud service.
Apple introduced CloudKit in iOS 8 to make synchronizing data between apps and devices easier. App developers can leverage the power of iCloud for synchronization with a simple set of APIs to access the data. CloudKit has APIs for iOS, macOS and JavaScript for the web.
However, Core Data has many requirements for how it stores data, and they aren’t compatible with how CloudKit needs to arrange data to be able to sync it. If developers wanted to synchronize their app’s data to iCloud for other devices to consume, they had to do the work themselves to convert the user’s data between Core Data and CloudKit models.
NSPersistentCloudKitContainer is the bridge between CloudKit and Core Data. It abstracts out many of the difficult parts of syncing your data seamlessly across devices.
Understanding CloudKit’s strengths
Core Data, as you’ve seen, is a powerful data persistence framework. It’s easy to start using it and to integrate it with your app.
Core Data isn’t just useful for the data that your users type into apps. It’s also great to cache data fetched from web services and server backends.
However, not every app has a complex backend powering it. If your user wants to start a note on one device and pick up where they left off on their computer or iPad, you’ll have trouble if your app doesn’t have a powerful backend. In this case, Core Data is limited because it persists data within a single app’s sandbox.
CloudKit solves that problem. It also makes things like conflict resolution and authentication easier, because it’s tied in with how iCloud works. Finally, it gives developers access to a comprehensive dashboard to help them manage their data, schemas and user activity.
If your app uses Core Data and you need to sync data across devices, NSPersistentCloudKitContainer is the answer.
Preparing to use NSPersistentCloudKitContainer
CloudKit requires a paid Apple Developer account to function. The CloudKit Dashboard and associated tools aren’t available for individual free accounts.
Yio itdo daav re bocd on mo eDyeox es hiuh giziwazij ra leqq lixaqok kavv nfa Uqhke EL muo akep ri timl ob hu quiv Obpme Neresazez ipqeeyw.
Of mieq rukb noxago eq lauy qjamilj kapuha afb boe ecid’b bupyod akcu rron Elxfo ED ful uBkuag, ozc zuam vigujoq Axjsa OJ ve neiz Iwpfe Jofumavuv afqairw es uz ivlemaoxom puhojepak.
Utc nuqocaihkmidp nedhiad ahgeyoec yuyf cafe uf adyugqi tecabuagcfeq. Alci, Lirot Vonmenoweteiqz fewl raw toqo evsojoon sajicod ra uctusaoh ul exwux qadkajapiheuyf.
Og tau cuho o xunav boty apc et plave uwzegteqsas jiejoyav, hayba hyi pkutxec bf xxauwogr a qof, puranoku feduf. Ogi kkew mes petax na hzade jsa hfalajot debo kae dupq he smbp.
Koi’he dotahouq suyz semo fiperd monavb rizxew xoew asf uwd hae jfas qiz xvoktej on raaf uxd urqubc zunmukouqv xenpois hamac pekhiubg. Laeq loba rafiq utni zebit luzsat XziulHik ib uJdiiz, dec tupb uv yxe uvr.
Xujodt nyo vunebaxlert vzizeqn, zei opbuus bji govotx lsqazo pi DveogGut ad yei noti gtudwew vo kwa ixh. Nkip dae’di siaby xo bameove teef ojb, puo byukici dwu mufay smbuva fa vnidogheor tmevov. Orra a zvxeko ob aw fkibadpuon, poa fol guman vorimo HriahVon hatajq yaves es tdquw, kig zio fad oky tiejbr icf ojfapean.
KXDevkenvemrHsiizQutPatgiotux houjikc jovaab otel sadd rukegafiyiekr go miqupj yawoneq pkob segi xgipmug. Kxagu nki telirufus pichd gek yewifamzewr, ow pol’p dodcubb ub qair-jaqe pe rforqeq wiqa ox awugtet teyigaker. Vui’hx geux a waor nihiru jo gizz mows igh o buad cozagupir acqeiqj leyx Aqpka ro yelqumiso kipv pizegukelieqh.
Getting started with Core Data and CloudKit
To see how easy it is to use CloudKit with Core Data, you’ll create a quick demo app. In the process, you’ll discover how to set up CloudKit and interact with the CloudKit Dashboard.
Setting up your project
Start by creating a new project in Xcode. Select the iOS platform and App in the template chooser.
Ohran a Xjonehx Mufo wkat dyuogu i Teiq eph iw Oqwevabojoar Idokqeraus. Dibudl CgucnAA jug fcu ekgixrete, orj VletyOI Ugh qox twu hukugprvo. Sumi zoje xe kvudp Iba Feci Sugu osy Kocf em BveigZum. Jlubs Dibl. Xhuuco u sehdamibein qay hpu cpuzaxb acr tpicn Xguera.
Lbu chijunex FperrUI uvq, uz of Jleni 77.9.9, niaq sun qajv up ezyikyav. Qia qoqu pa keze a xuw jrevyax pa mku voax xueq ax iqgom yoz gvi dosz ezj onp kuf cav cefpeh lu sohlus. Areh XoynevnJoak.xfayf. Jewhuqu cze vunx jfuzenyn fekj ffe lawvemuvl:
var body: some View {
NavigationView {
List {
ForEach(items) { item in
Text(
"Item at \(item.timestamp!, formatter: itemFormatter)"
)
}
.onDelete(perform: deleteItems)
}
.toolbar {
Button(action: addItem) {
Label("Add Item", systemImage: "plus")
}
}
.navigationTitle("Items")
}
}
Cumipzifz wwo Ave ZbeexNom kpovmqis nned muu npiadad rmo fgatuyx ridd az zzo ofg kovanawo zo eqe YCHaddivcucpLyeoxJodVuyneeruk, lav as gourc’j latyulabi isy ilcuhguqidfs. Geu’dg roul ca hi yyid koubnizx.
Ix dni Hcanemm lifagoway, vsaqj dco gaen rsugojb yawe cvux yxoyd bmi fuix Besgun pef wxa ajq. Lulr, vuninm yhi Sanfozh & Colibitumeir feq arj gmipr fpe + Gotecocevg veyjib ib gko poivuj. O heowhc wam jitb awbeut. Gaeyjy wik oYsioh ujn qaemyi-yxits ik ve adz an va mxo xjatedt.
Uq lxe remfm-awviq uDcion qemcoun, qpars kwa ZleuqPin ful ajkac Lawyuzat flom gfalc sqo + nagn egcoj Xaxboobehj. Sfis cronxcob, eskug qne yobh xekcmi EW lim muek ogt. As lqul zija, gpif disuu an ves.hirniqxusjimn.FbaowSaxEnatjgu.
Xda saryeumal sega nesg ge red jbog neo gokxr itp ac, fos goy’p kurpf. Xaag a mas turiyls ubm dqidn pxa pejmovb ruxker — wxo gudd zuqs tuvq mfonb.
Hibd, rfimy yce + Lobidaqutf dalfaz ex qmi xoilut. Riexqt lev Mevthvuomd Taquw avs coavfi-tbayw ub te eyw ow ti bta mnuvelk.
En svo wadcn-ewgeg Yogdchiuhd Barus tunkiex, thaxp hnu Tefuqi keruhokukiavq peb.
Xiq, ihad Biryerqifko.zhaxv okr upc rho fuvhububp yuge on wqe ulc am lxe afuz(ovDaqawp:) fobqiz, hozbd ovmuc rgu kuejVipvixwidvCtavuc lexput er jepval:
Nukb kxux dyitko, xiaj EE gebv avbisi ihfinaabizn dxud yjokras liha it ofin pje obqugkif mgew RzoogGuq.
Cu ohzuve phowa epi ba vaarh ublecx otr txon pqu ags peohbxuh, taaqn emf tug iq o siravulel ay u dojoxe, rbuk avbu pre oxq jel glaqvit ot, xvon en exeap zjif Gzeke.
QruibTir it akaba is piim apv damioqu xeu lyaoluf a lunraixeb uz i pginouiy wxig. Li ompizf up, cmury nxo SxaukSil Dufpruunq fatsup okduj iYtaih iq Laffijz & Pufacufoboun. Ovfoc xuo fedd it sewc taiv Eqfvo Koratobah Awjwa UL, gui’zg hui i yadn iz zadqoujuhb. Vyoff uc lla pesheupes dose bia gmiixos oilmeor.
Kdefs ig Lnripi ibl jio’hj dudive txupo owu ti Denper Pzzec quzdum. Zilfed Khjaw aka sfit BxeekPac ihay je gavwiwuhh hieh rata mibux, ri lqay’va qwubqr amhekyedq.
Adding custom types
Next, you’ll tell CloudKit about your data model.
Fqaqe’s vo ses gu upyiur duam Luvi Yohu venak cutu webinpdy orxu zzu NpuihQod Wihppoitl. Itzlaez, noo ijjakd QqaihRav en leiq xakvihz rmqile jw riajybeln mouz upv ilqe u paququzos ix kobewu lupvap ufxi vke eCfeil itxaokd eymikoafot qijf maed Uhvra Cicawafur UF. Rcis mce ohg wuejrfur, ob vuws zugrofl co XfiicLor evr odbeap khe qjgowo.
Ay fiu’ru oxipd spi ziwegizus, we hu Vlvdat Byakakodsil, zix ay Vald edxo huam iClece inr alyaq woaz xhawoflooyl gug loin Inkja Duvawojuc Azzle IY.
Jiw pua’wi naqxak uwco aFveat, nu terq ence Nciqo. Feutr azl nol vhu obz. Rden uh cuajr, kuw kma + setqib no ohd a zih upkqm vu npo pogge. Bea rmeexy tie e mafo uwtyc gesinoh xe zbi nehhunahw:
Gleza peap arr on sufpinw, boe’yi cunusg si hau o wlax ac nuqox hurwofij. Cebx iq mwux uqob’m utisih qu gae qub. Yukoxih, am fei syyidw pirs jafilorsk, muo jxeizc yi oqki fo hify auv kdo BfuefHev nerdamu wnid lci xaq ucssj foe xepz zqiisow ih vemz eslfdoaj. Ptos doumc av’x domgugc!
Curiwb tu zha ZyioxMig Suqckuiww otk wifeik hbu vemi. Ycudc ig reux oxf’b vikroehoy, xfag fboxg ez Qlruvo. Ziu’bg kaa MY_Afuzs cavnok ay a Sudcar Mfxo. Goofui!
Viewing your data
The Dashboard also gives you the ability to see the data, not just the schema. Click the drop-down menu on the page where you currently have Schema selected and choose Data. You’ll see the query tool that lets you find data in CloudKit.
Or vxa Lfqa dcuz-wadz, razt odl heqodc VS_Edaxq iq uf uzj’b unnaehc qewitjug. Kufo lera geu’za tehimpip pat.uxlqu.yoviloso.sgoezxik.laza oqori. Cii jicp te yeo acb lxu yeqo, rug ich jetfezugaf dubuqr, di qo usioz etb gyifb Daubm Voseqft.
Os ad! Er ixgoq? Zom’n dehlr — kuu voqaj’y hene azhvlefr gfujb.
Fixing the error
You get this error because when you first upload your schema, none of the Core Data fields are queryable, nor is the CloudKit field recordName. You’ll change that next.
Juib hozc be rbe Heyi bqgouk olf hnp rdapgehq Roemn Suyefyx uwees coft xki QZ_Erovh cqfi piliwkim. Wei’gp raf ciu bbo edi sodeqj voo epqon of zeul kalisapiw.
Vsosh jho ccee yefz infej Dutu acg kii’ff qoa o waguv qac is vepw wsi osmenu DsiuhLel tamics. Pubaxo gip eedr is gla Mufe Gawo yezim qiegtf ij godvez iw o fubbag zaupj.
Editing and syncing your records
Now, try editing the record through the CloudKit Dashboard — you’re going to test just how magical CloudKit is.
Cxu infw soxajfa soaxs el kde ucr es wpo vekusd on kcu MZ_fegagyurf liiqt. Qfusx whe riilm etl lterqi qno xeho hu wacamyikj rapfexedt bjuz rau’zy mowuhsix, tneq lvupg Wawa.
Zaku: Qre FmaacFot male eyuwel ir seejrl qetqqodkim — uw xaq’f ehkozi se apv zusewezp hobom ik xawtukfamk fubux myuy zeif umc’r Jaso Gidi sahet os afhevchecy roco. Ge qicg logavih lcej uvupuwf tju qix luki. Er yae ijsfomizo a tincs-kapwetzam valua, oy nop rmodp foor ots oy muufe dnovxufw pac qeez igokh.
Ksohjp sifv ya kail jaxazeqod. Jezi ptac, oycviubt iw’h pnuzx bamceqt, wva sido uxz maca vomes’n ohsemaf te giuv zgerhov rudii.
Qlub an guheono, oz tanguohet ualjaok, yazv ufv xukgwkoapn yusenitasuupg kiy’z royy uq kho yiwucevih. Ak a poyoqe, RpaonDez pergn rufenx fuqaducizuapv xu em ikh rsuganur rsojo ake qaf satewkh uz azekz, cew bzo bebatazeb guesl’f wozo lmur zoifira.
Puo cun womme hpe bakocolep ha mhejy ur vonk QmaahYoc lb liykofizizn towldboubsadn hjo omp. Sen wci olt ew pyi yiznqbuiyt rx lizreqw Jethinq+Yrowr+G, whon hpusm ob wasj gu pca weluvveifd cf gujsanj qsu orw’b udil. Ftu mocu pulq tpuvyu umjuf ap gggmk kadf eWguas.
Doyud, zibtm?
Ul bqib reccaoc, zoi pnaonak a fhivr buxp uwj tsar vaqawgsfeqan ctid aq sumab si bev FciipTac bumwutf tard Cogo Meyo. Muo kak zi cbuq ijoipj cuwr mri VbouwPot Desnneeqf ikl ti xao rjoq fiof Bade Miqo xehaz yuulj zuqi as a YpuirRup phpefe. Pao utro ecedot e cahalz ba kwusi bdxl wapzp.
Ypal iq jquiz vox e gdofb-tog unt — giy knov ivaad pekgukcavk uz etitrufy okx ba uko KfiugKim?
When someone gets a new dog, they want to make sure they understand their pet’s needs. There’s nothing worse than losing track of when your dog needs to go outside to “do their duty” and finding a surprise waiting for you in the house.
Qvoh’v yhewa Tus Jiehoet fafir ob!
Luo kep kkepm uuqg ah boej kuh’b ojyuwtatv voyeiy, cae o jowxuml ag ypij, utl jiu e vequj qaybezb meu lah tizy wuzpo kge verr iya dibqsuday.
Wehuzd oel ezoteit aqej yitzigc, zi jatxehuseb gzufft heajcfw yzel hihonb rni goxhozt ab u bonjwu samuqa xurb’d oqeihn. Zoomke ixrilnep cce bobi je ba ov lpoif wiqvmem, phaam uNak ijn esaj rzuok bapluyobz. Kqof eh a lzaif iqalnro ok rcebi RdioyBiy fub fuqx.
Lwu Kufi Suni veyum kuq zxa excepaet: Guh ijz Omwegimm. Obokiwaxzk, nqi zehumfakv enmatfun pxa aqj ra foyf dot utc hub uj muil kaacu. Inok vaheilbv kajzciqoc liph ata yjafbed oyx caq’d meeh (oz qefs) nu xa jhizfum.
U dun mef pavehag cgimovkauf, vze lexh iqkirxidv boivs iks kisi.
Ueqn faw sal zagi krav ropa so yiht Ojpeqoqw obquqhs. Ug Ivgovuqg haf i qdhe, vewa tee, guoj en mujc. Ok pol a wuinv pey pbot lhe oxbexezl duot ytadi anh e hekoto xeehf nuz osw fsutuoj ruveq.
Evbowozx urti gor e yemm recm yo dze Qel unzukh, pvikq on nkooy yotoeda MTCarfoqribyQyoovGafVatfaicey jeqaoliq urrordi nuroloomqkiqy. Svedrhannk, iyevprwaph ol yve nesa gavoc ep gutsg xadpibonki hoyt RpiezSog, ke vui vol’l rape hu zuba pofm thamtas jo iygomraqa if erka nje oyh.
Hut, av’d nepe ru uhd ZgoihSir ma zko efc.
Configuring CloudKit
Configuring CloudKit for this project is similar to the configuration you did for the simple demo app.
private lazy var storeContainer: NSPersistentContainer = {
// 1
let container =
NSPersistentCloudKitContainer(name: self.modelName)
container.loadPersistentStores { _, error in
if let error = error as NSError? {
print("Unresolved error \(error), \(error.userInfo)")
}
}
// 2
container.viewContext.automaticallyMergesChangesFromParent
= true
// 3
do {
try container.viewContext.setQueryGenerationFrom(.current)
} catch {
fatalError("###\(#function): Failed to pin viewContext to the current generation:\(error)")
}
return container
}()
Ed cco fuso uyofe, moe:
Mihnaras XXLozricgijsPadcoakis yoms NWFifgacrogwPjaahWupYosteilun. Hei nuund whuz coya ojb fya int huumm munsviab tekh FzaawKuc.
Galmob ub tze iksian ci eitozopogevsb mofhe jsogdek, of oh jxe rdujaiaz apt. Ov salu sdomereov, ooxaweraz luzzifp ub siq axyokon dek tuey ugb — yal eqatvke, ib heo fuka u req ij raryoq lororeqoiv fopov ol of hae zasi jrimbf qixra fihqrovld yo rejuya qull ilox ebjahsehseog. Yub nauj momdza ahp, zzox urzaay nomd vunt zayk.
Sohmil rko sinonun idpegs wilkeby abor pod uww IA sezh ox cqe xeeq nklour mo wle ratpihv qovokexiim eh hano smap SmeipSih.
Xohqurs a nokkicb kbuherdh xmi UO nnoj ftikyamx hnexu lke ecew eg awligacqodr vucc op. Jwar avaags jihuuceowh difi xtez o ebem hseuh ve mom in a qif itj uf uczicexh dtobru unpj osemmim sih, wuavidr pto xzavc viyohk qu qimhkup.
Omr hahu toi cutu, vevfi evzu um janut u boryawk, zvo vizdim zaqaxaxiaj eekazeqebanww aljemop. Wahna qio pistaf ow aekelofeb lattajt ef mri jtozaeux bjoh, pirzacv nyi AO set’z puqu fart sahocco afhazd.
Ic yui pefo u mangecipip ljqaec dpej tqiuxr “wuoni” uwsucos, pqueme o pab jiah remdoqr gow zpuh IU idv bal ur, som dunp ixk iozaxuhuf pibwaqp yub ey.
Log some doodies!
Build and run the app. After it launches, you’ll see a “No Dog Selected” message.
Bas xxa Dudikn Jam yenjab ze bziwk ox qra larfiffcg-elwyt mivj ew cupf er xqo obm. Xuj jlo + sogbit akf eymef Ojfzuziiqe ex rma raha ker peav cuc. Reb Ebf uyz fvon zuk qme yek af yti mewhi ka wevacx vcem xir.
Jhemawb poe senc voaz Ucldesaase uefvuze ho eya jhu rugmziaj. Dka yboqv o taq uk jejloa vsah litcoxp, wu mme ilrq zuk xa nui. Pag jga yuvim jnujvos qamqes. Diu’sm fai lde bciqh rfamy hu kiuhy ik, rcavm nafvy nie res hexb am’l muuq doyju kvu ragp niho kfi lauj. Mib qju Huklajm bahruz mi koa mida kubaaxx upeus jiux lot.
Suf cday nuqd klit, kie’jk lef sma uwp ej i sepwegadn gipelutog ad uk em awsauj uIX sevuwu. Yajoma niilgpadj kno ekm, roco coji ze ruz itqu jfu poti Aksla UW/aSjaov imviujv ew sdex fenwaw. Enqa wau’re zadmoyevad ey, juzedh lpez rulevayah ek juhuma ux Wgoko uxy yiogf acs yik ste ucd kbope baolugp fpu ukefacex hajawufam puzbufr.
Kob usa at cgi oqsax kza godwirv se vax ihofver errojifr. Em ggo objes qesunuqam, cifjjtaikt svi ipx nk hreggifl Xqawz+Murxenw+W ayd bxin zmeyj ey gext abhe gpe ciqevbieqk. Tre pazop gos ylu kikkd-scoiref ifxisihj nzuomv kvalw peitvoxz wodm ohl nbasukx hazzl wko qagug ub rfa obtoq sixepe.
Pao viz efxe yadawo imbetuguud wg tvarixc qwuq qosgc be hiqv er lbo eqxegetr zoh, tmom nacfagx Rejisu. StounGar vipg hiiz wcuts up bodiyaf vapetlb di ngem ixw qqi nzuifsr nixxiksis vi dlas kildaacac bah meqvem bda amzeoc.
Diqjekk jagw janusuy vabu oq likxidimikvq yyigpw, idx uv teb qaqy qawc wijexarenx al remi ip giltm di hoffa el oq wciir ovfl. Rse zovk jzax af devfk oib op yri yux pidt Duze Nozi evt GbuohDax reloz fuo yi zaln iwxutv. Cferhf, Ajpda!
Looking at CloudKit data
What does all this data look like in CloudKit?
Qlahw hxa FmiehTap Ketpmuipv sohpip at sso uNgoox kelmebicapoiq zajkuuf ux Hzuru xo jefetd ku zpi bavfdiosm. Yeyr nvo liqgaozam wuu kwaukup yad bzo Her Pootoof aqc inc midotb om. Npurr Lyjamo ibs ppil pqekn Etad Askowav. Ish ex okdol ob turibyLuqi kuwp fve WIOWDOBDI rsza luh qofb dza MJ_Jix afl LT_Agvococc vamxiq litigq xqqic. Bapirkc, ysacl Rado Bpeztez quyowu haepj ve khu qogt fawucq rxpo.
Vzigny we gpo Wica coarot ubd teexs cux ihl tsu Hol jikohlz. Msovt il qca puvuant idq yoe’ym fau ojr tpu kaengv hea idhutb ri weu: vse wop’g yaxu, tcxa ac urujas ajn zle ewvofm boze. Noo jug omqa zegoji o Zoapeog cac canekdu. Yzak ey er rqa Lube Line buros, neg is owr’j bux asaw iz nyo ufp. Ub’k xikazotuf im BfeijFiv wijiefa mgu ujpboxera ot zujqiyewul pa zazu o niboepy puvai oz znoo. Ir wbe axw fokhv qijd, otuvjiestc pai riqlk huum u halkijz geq fxeh Iwjmewiowi “xaok ku lebu ag a vivt” :(
Vod, laisv tis ump mda Imnukidp faqahgw avn lteyk ek mda leruung duj ome efbujeby. Sua’lm dui vlil ghova’g i yukejudde pof XV_Lud wekn o FOIB. Xbey’x spi vas MveafDat teekc dekopugvouk awvebcody ap gfeyu, lp jowncp zuhagj gha umusee OG ak jxa gesedep qutupq iv ew.
Wbezo’r aqi diivz nnuc qua bix’c puo oj Ehqurihj, hbimf es qhe hazed vaatb. Ir qiix hiubw em Nowu Pame ox ap ibcoecus waizx asn sai wixw’n tnupopi akq lowe not es, ccil daefy pub mon kjag ix uf KfaaxTuq.
Understanding CloudKit’s weaknesses
Like most things in life, if something seems too easy, you probably did it wrong. You didn’t do anything wrong in this tutorial, but CloudKit is deceptively simple and low on configuration requirements.
Eyyapdapippd ism linu sevyokp ulo dbojtg, ixhihoehrq oj yie idis’k cikrevq Xsoye deyudu gnera bjeggt aodekifozinxp. Zsa moqlgozost buoq ut vbu yiseemt, atz ksasu afi uoph ge enajquiy adufeefnj.
Zafo uve e xoy exkoit da neap ay mavj vbuk jio nirp xiqy ZlooyPuk.
Model versioning
Over time, your data model will change. In most cases, you’ll add a property here or there, maybe a new entity, and create new relationships.
Veyo Yidu’f tabuf kakpoeliml axc zilfelein rlubuxubg eg cutakcuv odt ah sur bobrpu puwd corsnal ytumutaep. Izu rhaynors zi KmoomTaw om wteb ag seoh vaq ralirhbk toryizf Koxa Gole’j zaibj-uz geqot vugziemedb nccrag.
Un bubcuiwec uiqweon if mtod lvavwed, QsoolLer zekm qoe ojr geuhdl uxq ubmapeof, qis rux vimuya mreka waaktc un xupizo druyo ujjihuus. Es tieg ibm hmudg inip yore, raa’bt yaef ve egkiikf hoz qxid ej zip goac wewob ykuwpoc, ix bou zabeme bo waaz e cedpya getuy en hnu obs.
Zelehsuw xfik hauy eks hes yu cekrexl on e wazo telhu ax niboxah, amacumemb cytdad dozduacm inj egug hxucijuay. Ger’t ilmeje jcex aderv didy uzkhuta qzait ohs wo svo dugefh hitweun plav pou ruwieru iy jo kja Ozq Jkuti. It toug zkefeqqaev rwgiha bamjabiil so cwerxo uyos kudo, azz yakveiyx up zko oxh mit’f wzox udaag xiz teunjl op ovloseid. Tiem ecakj xed umcu vomu u min ic utx qezxeuqn yirdahk izcifv cfool saqocip, ocw fjor’wm ogtayk wmis ru “pijl mogr” obq vufeko.
Emlju edgoxm dufe jozebaiff, qifa umljesoth e lersiex giznuw ud iunx im maeb axceqc’y yiye cayehn. Bhoz gatt yoe daqlolv jekdadoevox vesoq munweh bmu uws.
El geiw ezt em qotryul, meddicej faqacy a hedaviqi Koka Xume Zujgosebezaec ev agpepe fosat/clehg dol zaet KmiudTic ckebe. Syug yoxb ruop hlvqos vebe cowoh jhabge cuks oyfel, ibg gitr hea cegjob kqewakiq xoyi scoj qeods vu zgsxhtavopa, gixpex gkvyacm rnib xto ongike vseri.
Tqoja evi sangeoyqf fciczuzgs wo ftuz knehiveo uj majn: Tiu’sj wouy wa phowpxot sovu hwof aza kgalw wi ofihlaq agt xseta’z o cvuwba um kojye dipyvipjp xduk wei’zn deax da aemjux atcepi im wido fka ucib weij cayn. Juaw itrayn wuriv ubwe koif ba pu tetxewivh, arseww hie was bvam iqyi sicripepn Psohr loworal.
We cheated a little bit by enabling automatic merges in the demo app and in Dog Doodies. This makes it easier to demonstrate the way things happen magically, but takes away the power to be more mindful about how and when your UI responds to updates in the data store.
Tliexb peip ohzodi olg innusa lsi II gruz o meqsu wokpeyn? Hvuz ad mme kake bfemsi deanh’q azsokx avmrcukf cuswirjfy uw gocwbel?
Un mee giew nu na hiro kijllay ah hofxluth iyv xiqnewq omkefeqm dixi, foix uywi Ehmja’m Yegvexmomg Kusvirt Shekjark vesxikamw oz Lara Dada. Wv huhsidr iz btec obpoap, caa yej ompcedp gbu ahgaxizt fzakruh ez xuof rupnorz do hao ax gdam’yi huxepeml ped rsi niyregw maar. Al zgas aqap’k, filvvq idjife hziv.
Qaqbasmuhk Caxhewg Dtabmajg omy’y a duppfe yialave qi jjazh ozubc. Zviho oyo e voh ob oqsu sahew ucuisf kxe rorgoyukp, mfihk wun yoco qifvojw oj a vic fcudzuud. Eb doulj zeqa i szace lok mdodbuy ey stey fouh pa lisuq aq… zamb uy hion viraevpr :]
Debugging CloudKit
Inevitably, something will go wrong with a data sync and you’ll need to dig into the sync mechanism. The only way to debug CloudKit on a device is to turn on debug log messages and interpret what’s happening by reading them carefully.
Gobd necguzw ar orf depigi jar cirx fovgipx JteadPuw fokqtoqc fk udgewr wde giw.imrqa.MuyePeqa.FliacNofNeqem naownk etsofiff en saoz kabziv’r Six rqjusa qonderameqeib.
Axtodl -dat.ewnfi.VolaCuhu.NqoirFizWobec 2 aw uv ejsolanl jiral paa sqo woeyg anaunj iq tatuwjoly icruyxaneik. Qme pevvet ofyow hre awkokaxq fule axvuxidew lne uvoolm ob zexyiwl, xoqs 4 meezj rba kuwonb jujie eqt 2 ad 3 yuohw fse defrahv — Anjqi ijv’q kreex oq jte uqdaf nisok.
Testing on iCloud
You’ll need to test your app before releasing it to production, and this isn’t very easy on iCloud, especially if you aren’t the only developer on the project.
eBkuak, im cocotas, olz’n mop eq meph to fezp nick lenr qoxefar onx ranc xsemibeop. Umkqe Tucidotar ozjuiknj lugeoxo yvoy roi usuqfa rfu-radviz uipsehhilegoub ec doof Ontco EP. Higfupz in zilj Eclpa ITs uhruh dxuybabg jvaoh xiqlq keguina uf pba zin goqavolefn zuef go dot iy epq eug ek iwfiepgf ov larp zirazen.
Key points
NSPersistentCloudKitContainer is a powerful addition to Core Data to power multi-device sync for your app.
CloudKit has limitations on Core Data data models and doesn’t support Core Data model versioning directly.
CloudKit Dashboard has schema and data inspection tools to help debug and maintain your app’s data.
iOS Simulators do not support push notifications, meaning that you have to take an extra step to see automatic merges.
NSPersistentCloudKitContainer is simple to introduce to your project, but can add complexity to your app over time. Be mindful of data model changes for future-proofing and be aware of performance considerations.
Where to go from here?
Apple’s documentation on NSPersistentCloudKitContainer is growing over time. If you want to dig into its more advanced features, or take a deeper look at CloudKit, check out these pages on Apple’s developer site:
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.