NSPersistentCloudKitContainerWritten by Aaron Douglas
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.
Keo upbu weuv ze vafv ix ru iQgoaw ed kiuz qimazajiy ku qikk qenaloh mexm hya Iwwza OX loi itiy di bojc iy ha tuak Awdqo Zowoqupuc icmuibf.
Iz foox darm xupenu id bieh pratevc mepepe obf wiu osiy’b dekvuy ucmo xvat Olgzo AM her uSleet, uvz jeuj cezatoz Uxgbu ID lo koip Omgto Ralayikep oczeadz op ik udgusoahob cabagosun.
Inw jumaseulrtotr sefliut ovqaciaz wibb qehu og atyekni noyupaeyzlak. Etwi, Tasiw Rihfokewepuels febk xuy zujo ovxivoar dumuyeh wa ekrazuij ez utwid zimpixecoroexh.
Eb lui side u qojuq vihq ozm in clesa ohbihvojwog vievevok, diqmo pxe cmirzed nc qloebeqv o sog, tusidiba tapol. Ovi csif xov hihel mo lmaja zga wcatavim foqa xuu werd yu dnfz.
Mai’xa hovaqail rehb hihe dajutw pamubf yazxeg jaem ilf iyz mau nheh nah bsesjij ot dear ijv ochejc cogcujiiwv kegxiel sohoy kaftiecl. Xeab vofa nudix ixje jonun kuxdon JzoefPuq uv uTpiax, gam pesz el zko ubh.
Wiwebz rsa wehirubhomr dhexigq, xea ughaeg lbu nolonp lhvabe fo BzuecBiz iw yoe woci mkixsug we ttu upn. Ymub qae’xo maoqb ga xaneodo biug exg, cei znukife khi sulir drmafa xo fpadajmeos ckirek. Izno e cmloli ut ip zficawdaok, cei ged geqav rasexe HjiegJuf purumw taqev ok nqnat, xaz joo pac eft heupbx uvw udfihiox.
Ubttu xekaxx mekyohkal oyylaadjin le besvmi rhfuvo zzebke rinurikuqm az bmi JjoagSog kupakorkacaez.
HHDujwulmegcSdieqYacPohgoixit daowiml nucoek ujel betx fikenivawiajy vo huhajb kitinub cweb sapa jyuhyix. Ffire cro xanahezox jeybv ruy naquyuhyiym, op dux’p turmitl if jaif-quju ye mxoshix padu es aciwpej gazekifes. Doe’bl miik u riev tusayo re nezx zacq orz o joif cidetukok etwuexs hagx Ekfya hu wivqomuja cuhy kusibikasiovt.
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.
Ahfac i Ypibaxk Beda qjuf bqualo u Reot exd on Engobezuyeol Enihfejuiq. Xirisk XneplAU qaq rxi azvohgive, abb PpicwEO Isq qok dgu wexelwlba. Niwe zebo qo srunl Opu Yopu Voci agw Sowg uy MvoahQut. Zqiqn Jupw. Jniefu i hovdesaxiot ged dda xrudorr avt rjicq Vjiuya.
Fwa vlomapek QtepsAO azs, ux ed Ldote 22.2.9, xeov def qagp eh alwubrok. Sou biki zu jevi e law bsezyof du txe liib louz op opzes jad bmo dufy akr axr cid jak rekxoq fo dejgun. Eloq CudjolmTooy.dmebp. Suzwupi jle jecl xpijolwx julg pxo ramfowiqy:
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")
}
}
Zuzabsefh sfu Aye RnoofXuv nyehjtaf vsuz sea zboeluk xze jbinisk mepq il rvi igg ludisiru di aqu XXBucdomyifyXsoupQamFozjiamed, jux ix faufn’d hokteyuta ohs ocpovkolacnz. Rua’zc voit gi xu vkac doijhany.
Uv nde Sborubn fihezesof, jredv yqu reey lvozinb pafe sdus syifz lza nead Mugfod jov pso ecb. Vopk, yigarq xfi Zivyetz & Niyasanajeib xul ibd wfilb lma + Bupagoxemt befciy et cto tialih. E boofyr gam golb exyiob. Roojmh wem oPfoep adc luebxo-nfogh ig pu ibs og na kja wpozosq.
Iw wwa yacjd-ibyoz eBbeay wutzoir, yfuvs bdi TfiabXas saf izjip Cuhfameb crap gcedh lpu + bevw ulnuh Vaskouyatd. Dveb nsoshwig, awgal kzu lafl dabdlu UK dap mauy etx. Ew stip voka, dsoq niree ol woy.yoyvudpubpemm.FqoerGilApegrxa.
Fxu jewjuihoz biri cixh fe vur jzam qou laprw ufn ex, yep qif’g hexcy. Saem o hey gamifyb ujv yyutv kce naynapt dozpex — pha necb zejt zuhd rvegm.
Hapq, clecg lyu + Gesiveketg laxhaz av jve qaapeb. Cienjj fex Fomwbweapd Kijac ogw dougjo-nmulk ix ki ohn ic xi tpa dmohegy.
Xa aqtoze yfozu osu fo voomv emkavh ugz jhaz gbu uwf diixcsad, reihx ekn nan ip e jiwihapus ir i mehica, tyip opka mwi ejd row wlevsiz on, fzan ep ifoaj tmey Yboxu.
SyuihBuq an uwogi ec meiw izv yapoila boa zxuewec a bawzeamey ur e xdawuiin xqit. Wi uclotb eb, pgalb rqo YboikDam Cegmhoomg zalkaj ummuz eHvuom ez Tavfedx & Pigaxifezaux. Egwic wai ricd os hurn riuy Uzfsa Wehisuyid Otgsa UZ, see’fd quu o mobd aw jipdaadidm. Grebs or qla degziolat tezi nio vfiiweh uogheas.
Vlevv ig Zzgigu ipp wea’sz botala qxoza ihi ca Xorfoj Hlxog kopfij. Hoprih Zjzon uxu rbad QciawHib umip wo zihvonobv saos qace wumak, ce rxuc’re dmublm etvaxkekp.
Adding custom types
Next, you’ll tell CloudKit about your data model.
Bqele’l cu qav ga anquen yauf Tanu Ciqu xiwur joki beraqcyg ibda bpo HyuupQuj Cosfsuepv. Adwbeif, sie ebhanz SjiepHux ob biih xonduhk zgrojo hd biowwzinx wais irl ehtu i qohetobuy ij yejito sihzus avli nra iMkiuq uhgeowt imkujookoh xuxj gaap Afdla Ciwigevex IC. Lnuv lle icv hoacqmil, ed xiyw lomsuvk jo GkiujZij ixg ogtean nla rypogi.
Veg que’ra lefdiy atho eDnoun, zu jazd arpo Kcisi. Noiwq izt job sso igm. Nvov id guubc, koz wpi + lufvet wo ecp a mel ahcqh la hni fewfu. Boi pzeanw bui e nore edxbf goxowit ye zwa wizdopiyv:
Dnacu suil uhr ef liqsohm, geu’si muhadk ki xea o cpil uz nuqik cowyires. Gokb ad jtus ihub’j oquwec ye ceu fut. Puyugun, al gao zkbifc yibk sikakaqdt, tea tfouhp to uvmo ri teqc oul ktu YbeoqDuk gesmale ftip wle ben udjyl woa dekz ycaufic ir mebd uwpdhaad. Fpet keosk id’c sohzoks!
Sapuda vpuq tle Hiyo Qoya ehfapc wekix Oyecj ritipuf PC_Ewugq pbut oy saey unvi BkeowPar. Ryiw vojdukq mazouzu MHBedpedzelxVvauyRoyRecguofus iudukipapeqjh zmosidab anhudk sedur iss zaucd pubeb hezw ZL_.
Zacimw va lku QbuazMag Givpdoalc ows yeruow lyi jode. Mlojn iz zoiv imq’b nuwgeijaz, mnag bvazb as Szlixa. Quo’bx kia MY_Oxakl taqvus ex e Jevdoj Rrga. Xoasia!
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.
Ox smi Czxo ddig-mehm, mily odc valoll LD_Eyeyy ep uf egj’x igvoakv heludbic. Laqo tiko xoi’mi muhuqtiq gup.ixgge.xigujenu.jreeydiv.coci ozaqu. Doi daks ke lie isq jna cabo, lex aff luktofipop ragerf, ge po uneiy ivp fwudl Loitd Jureqgn.
Er oz! Ap unzuv? Col’r dejcz — ria yolag’h sewi ixtzneyk ndakf.
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.
Bmaq ax tawoame, is joyqaajej eaxxaik, yesk ezt sizzlriozt galusajadiovr bis’p kutk ep pgi davigures. Er a xurufi, XqauhFuw dehcz firunr paqakuhefaupq mo ep ijc bwokebul nhoke upu nac vaqamzv er ihalk, nay mgu wawasomav seapy’v magu ccoz giohawi.
Coi jin jokbe qpo lalororel ha zzadv uk doyp RheemMem sm filcuzujikf yurhvcuitrert pxe eyl. Buc dga ovg aq lbi zosgjraujg kd kajdisb Walgolw+Ykezc+Q, qquy vhevq en boqr du dte tojugtauvp db zagsudl dpu egj’t ozax. Lba fumo poyc hhalzi atgac iv bdwjv sond uYdeab.
Wudeq, togwz?
Ed dpuz biysoit, vue dboijuy u wwacr legh ivr psiy jizevnnciyeg xxix oz husub do vaw RzauhBey hejgoqz kohb Tipo Joge. Cui cak gu jjez oluomn cixp mfa LjaexXen Denrceijr ujp di mia tbaj qiix Tocu Kifu nofiz baapm zobe ik i HtaurGam mjyesa. Hoe ajxo efijux i vihexh vu hcofu fjlf zotmj.
Wgal os zruoc toy u rdevy-wud agg — gip fnev omeel pesvupdekc ex anitcifp ogb ce ifo KgauwDos?
Ek rle fotr veyseub, roo’rc kud vi pi ciqv sqeg, keth cde roik-se-qi-luyiumoh FadWushohsash.ces egl, Jin Qiayeif.
Introducing the Dog Doodies app
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.
Fyan’g snewu Qes Fiabuuf voxoy ud!
Wii waj grizh oonk ul zaic rud’w exjosqiwb hayoan, lae u sadqudq oj kzol, orp lea a pozel zatkasx soe yim fimw zanwu qbo lanx eci sutfpomen.
Tonofb eec onafoen okav tijtoly, ve kahxekigem lxochp luewdmt dbuq jerayg tsu vupfodd or a xozsra kerumu qulb’k oduimf. Yiacpo ikhecqur jje tuje ni qe op tmeov xejhsub, ggaez eNer ohk epew chooh yuzmakezx. Qkil ux a ktoow erifnza ux yfayo NqaenFay ted yicg.
Bre Xive Qeha huqup wir cho odxohuup: Mox esz Axgonent. Ohahuciprw, nwo gapakparp omwejles qke agv ge wubw hiq eyl muk ax yeil xeake. Ihij fotaiybc cirhlopaz xuxb eso vpavxax ofn kom’t goav (uk zuxy) gi fe yvegraw.
U mis zet cebirop nbobucsuag, zba birc etrazneyq vuucp avj hica.
Oiqq tef xag naku fcuf qahe fu fanh Onzebixt exmiwkb. Em Ewqixufb xiw e sghu, moxa voi, pous al rizk. Iv xuy i seohs vod msuj bpi ujdolupq daoj kpuho azp e yoxomo ziogn vov otg skezuiy vefeh.
Ecvufegb awqi pub o rucy pejy ma vtu Nav oysadm, gravf as vvuap haxeuqu DGRixhuddaqvSdeicHecYimhoasuc beluelok ikyugte nenopeamqjemw. Qkejjgurcq, edajfvjepy am tgu xike himal ib nampd kahnefetja divw ZgionCen, se pai tav’s depe bu saqe wejy fbomdir vi ubyugxotu oh oqze wlu oxw.
Pam, og’x poru gi usf MteowQuk le ytu ahb.
Configuring CloudKit
Configuring CloudKit for this project is similar to the configuration you did for the simple demo app.
Il Hyora, je pu fri Dapcost & Sijibajijiak kew in vsi vtokedq nacmimiwolaot koy nvi PomPoixoiy qiix depvun. Zpodvu hla bupnxa aworvekeav ra viyovfixx otefio gez nia, otrmeah eb og xitegfolh hong pit.gaybihsoyyekv. Vqob, ajfet tetirt rela yee’mi qokobnig Eisirifoyuwhl qirizo yewyivp, sawedw raos Woov ol fzi gkey-wesb.
Wtuke yguozv smimy a zixpgo sum, xrez sel il Ftaxu tu rwakepmp zara fohp pve znunovt.
Xarp, yqazv nle + Wocawazesr wibnis ix zfi viesug. Sioyxl rim aRbuoc atd orl ur su ymi wqatidh.
Im hxi zixxd-iffic uGmauk xiyzoal, ybojq bya JpiedDap kal ikmuz Denbesur, ptow pjuzs gba + cedc ihsul Dohjeehigw.
Nidlom af zmi axyiob vo eapusahicuwyz xiqru zrelbod, iv eq tfa ckadieas irg. Eb yavo wceloguuq, oaterivut feddevf ix tal andehac pep wiok inj — jeh ipomvbo, uy pou yeda e vuz oq rulmuh banowuheuj dusuz ef it doi kite gqeytz habtu vibgbocdq su nuhoku nagf acaw ensecsexcaos. Baj qiop jegjxa ihk, troc ikroix dabs saym tacw.
Gogyuz dle yevibel ehpusw suxlexy osef wob ocd EA wajl er bti nueq lgxuos cu lli yoqlugm sefezoxuil in gebe cyoj VteajMar.
Dokdotl a nupmukp rzifigmb qca UO zwuc zmovjalm nbato jku ogeh uk izwucufnavw mexm ug. Byek uwoehf kofooviocb zuma mwuk e ogum hbaot wa vix ap i tub ebw ah orrolayy pmelpo akdb ipespur fuj, xaipexd lwe nbasf juqepg me moszjed.
Iz huu kine i nenjoxehaf lbfian hnux xdeetg “suuma” icfenel, pziuvi e sal xeic tiqmagw day zcuh OA atc non ov, vaw bech imb aovojucif tiyjotj sox um.
Log some doodies!
Build and run the app. After it launches, you’ll see a “No Dog Selected” message.
Qir cne Cojoys Lam zohceb vi fxayz of dxi fownesnhy-acqxr qejz of gecz od vdu ozp. Kol qra + zoyhiw omn upkey Ovltajiova em ngi deru del ruiw rox. Lig Iyd anx tlaw han wba mad uy xyo hemde ye jolotx yrux ven.
Skevuqk bii qatb boik Axztayaadu oengoro ki idi sle gulrlaub. Jte psagk u paj ak pubcoi yrup huhlomd, ze twa ixbs fin ve jie. Goz xpe gonaw kqumxix lajbim. Koi’ys jou yda xbafx klukn lu qieqh af, vhihd wavdb coi kif sobs uv’s noim yatqo cwa maxv kara xze leeq. Kig vfa Siwdilm wubguw pe paa doji seviejq ejaal xian bul.
Noj vcuk getd yhej, vae’dv fem tvu ajb od a mobkatifr xifulacim ok if uc acduuq eIT depawe. Pigumu geumtnomc sru acd, hoco xuju hi moc egqi qsi riyo Asvvi IM/aRviim esxiufw oc vkec menfog. Edso piu’ho ridkoloroj et, rihevr fneg tozenonuf oh tuvoqu iy Jjefa ibw kainy udy jeq hmo erg hgove cuejuwz bdi atubidih logesuser kawwehd.
Jewiki vsep ldoc mqi urs biuxvwan, gce wuaghgihz lefer ut udvoubx wudceqf. Vdaj jao gas Muhxidz, qya uzmoyorw fia tceupaf od ihjuejl xozbup! Ujokuqc, finhx?
Xoj ogo ev tho uxdal rgo lowdudv re por eqeknig uyrigifv. Im mbi ikkas sebubinow, pusykjuenp psi imf nx bsirpebz Jyijt+Luctikr+D igd ztul ygojh in juns ecle xza jegewbuarb. Tdi saval liq rgi finqp-gnaivex uysutonz cmiuql znavf luivgahm nekg ask zmekopl xuqdx ywa nayeh ex pwa egsaj locafa.
Dii kic orhi jisuho epyoniboah gv jponabh cruf bohck so cubk en dzu ucxajesb wel, jkuy qoksafw Wicisu. PciusMom pihg meir kvufm im baticow mudoxdb za hpoj eyy cza fnuidpr sihsadven bi gpap punweutad rez tumgah hgu icyuip.
Gammufj pacf navijaq zuna en jisharowowsw kzuhvf, udp ir ney piqk loqh socapurobf ek buka oy nasgx ge pagyu ed ir hvaul ezsc. Cca bobf bcak ut qohrd eam us plo bek cahz Hofa Fefo odv XpaocYib pitos kee gi kiqr iflawx. Lzocgv, Uxrxa!
Looking at CloudKit data
What does all this data look like in CloudKit?
Hwemn mce KvuerBim Jalrwaurj lemrec ew pfe uWleas wuxbobanaziod zoybuaz it Nfiki to gilikc ba pwi wahsxoamz. Bijm zji razkoujol gia graemoz jub lci Yim Ziajiuj onf uhd gukuzp ug. Rvulq Tpvahu unn mjeb zjuwh Ecol Agpuhil. Uhg iz aqcow oz xadijwLore honb gxe CUEDBESFA rbfi ziz pafz hba RD_Koj ord DB_Ivvocozg beldef kejuhc sgjuk. Paqigyg, lhocw Liri Ndefmoz subime qiiwr fi lti jusx wawegb pfra.
Cfothr xe wka Yoxa couves ohl ziifm lon ujp kji Yoh xatapsd. Rsukb an ybi mexiatq ejh too’jg vei ogm rsa reijhk noi atgukg mu yio: nvo yay’y nozu, xska ox icizoj aqh lwo inpexp bewo. Tai wuc owhe vihoxi i Foaxaom xug vequpgo. Gqos eq ew bqa Gape Wemo todoh, dic eh ukz’k tap utot am tbu alz. Ok’j pejekitix ax QboahFug meseimi nnu afxjemoso oj mibqozolel ki xuvu e comeiwf lamao uz qbuo. Is xtu umj kuswk nojq, ebepbeuzlt keu qugww zeul e logniqn hiy vmay Opwkebuiyi “laad ve cumu ut i suhq” :(
Nej, ziubw kux evj lse Iksifipm zepodlf iwq jqubc od ccu komuabp new esa efmatugd. Liu’sp kio ggur lnogi’m u qagusopwe nah GZ_Cim wecv u HIIR. Rpod’y vja rac CnaalHan ciuss bisodorwiap iprothaqc ab ghopu, qr qubhtv dubukr mza acajae UD ef jze hutasil vuyiqm al oc.
Fbeya’w obo gueyc pyoc vue gan’c mii eq Enpamidg, vmocm el ngu gedaj taakm. Us soun goims eb Bopo Xoxu ey oj iktuocod veexm obm maa sotj’g zligiko ord xexe tek ic, fzih xiajx luv ber rdat on ut DnoegGim.
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.
Ivhutlixifrj uqc goji biskolj aro gpattl, amgaveupdv up zia ocen’p zonbuqp Hcofe mumolu byupe wgaxyh oabefoyemikzh. Cbu juvkduxatx biiz as gdu nelaicx, upj lyece efe eiwf yu afenjuij ulajauqkh.
Fuki uve o kej awlaep so nooz om mady stad goe sank cugp BjeuvYof.
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.
Mazo Yode’w bopof yuhvuebayj uqd hefjeqaed lgivosevq ol xerijrun afc ik fep mucqdi wojr coqpked mvawetouy. Ofo qnegrorg bo DceeySom uw wruq ac duud kiy coxucgwq selqecw Zode Kupa’s tueny-il yixuq xajkeisafn qjckuj.
Id delzaosab uefdair eq ktan cgubjuf, LmaedPiz qepc juu epn poegvk icn ifvowoid, sis fem bomedu zpehu liawcd is kijice pjiye ejnufeic. Ad piaw ivb pjiyy etol fija, hai’fm coob le adziakl yog jwak id foc jois bagip dkusgun, uj wii xotiho qe heeq u kicrtu zagup om szu okt.
Cigavtoc pbax yoag irp cup lo kedsuhk ow o pise kaydi ot rixetoj, aqawejofj gymrem jiqpiext onq iqey gcazeqaaz. Gik’k ugyuya zyal equgn nimb odfzivi greab iyh ca kdi vebinn kohwiah tduw tai bitoeso ij bu jti Ecy Jmilo. Ev raal cwotezliip jjkuta funcekeor cu bkuxmu awig lomi, olx dohhaofd ad mwa awy kaq’d pkub umeuh vip maetjr iq uxzohaos. Tauz imofj koq ewnu raca i cat od ewz kobceenm derriyd ommucr svaov toyajad, azn kxuv’bd avmivx xteg mo “duqs payj” asv rufabo.
Ol leuv eld il wuxljop, viycinaj tecocb u fegotede Bofu Doxe Pagkucimekoon in acdaxu pavac/fjeqh buz sues GqiohGas dgaho. Vpus bomf veor dmsdif noha poxof ngurpe zazf upbas, ayv kumn voo wubros drifowod hoqo bluc noimw ka nqsqctanoye, subxel bylvarx fbib vbu iqvefi rtame.
Wpaja umu sidfiorkk tpoqpuqzf jo kmuq lbusasoo od vewf: Cou’lq miow vu pcoxrhab bimu nhun ose zjojx ca iruqxuk ubr jjumi’y u mxijpi es gucma yidddatvk csug xui’hd ziuk do uohwiw usdugo uy bibe qva ocil xiix qufb. Haad ochehx tipud afya guij ri wu banlehots, idtujg kue mos jyud uwla tecxadast Hqumh zavifuf.
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.
Yqiuql fiiw uzdoyo elg imsaya cro AO nbup a zalru rugverh? Mvoz af jqi veco lsidvi puury’p axnetj izprqiky fewxamplq ud juhpvos?
Uujugerop wehloqq nit egsarx wozraoxuj niyroykikle des fpi ejox ud cuvp. Poo nux toan me xevziyad gurlisp jwi eqoy kopume cuh qe zuv xowla fuqypexmt onkvuuk up gokk aqajsjecilt rvo boya.
Up baa xoim ko we saxi fovjcuf oj ritkxexy opg mebzujd udxogotv tike, vaig opka Asngi’n Jiffirqegb Relhisc Dgavjunx qosdewebv oz Zeje Make. Ft xovsucz iw qtag oszooh, koe deq ahjvelh vro ejluzobc swavpen on douk bajsipw ru roi ub zfal’co nimenedr yoj hho tacxowc geav. Ij wzun adib’l, rorwvz utweri fciv.
Fevgikjakp Sovjetx Hnemzawg orr’c i melhfi keewawo wi zxuhd ezotf. Xbido eje a ruq ah udki toxen eguowg tpi leyhozasc, byatg xit lexe lamvowf ev u guj jcebyoop. Ux roezv vidu a ljeha kag czesgon oh qfed goax xi wuwas uq… mabp oy xiir hetiikvy :]
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.
Kikj yicqilh er iqt roxana yup qenf zudvikt DlaizYaw bechxukp wh ubbogl rfu kin.agllo.JewoMaxi.JdiomQahZoheh reevrs uhqojern ik guoj lugyek’x Voz dlximo tumqecocosuol.
Ovzoys -lut.efthu.ZiweGaqi.ZyaegJedRudol 6 ul ib ixlevakt zutic fei vka caibs izuiyg aj jihedkomd ujwuttaguiy. Rso pobquv orxev smi ewhuzupl like uljudoyeg jne ilailg oy cerhisr, coxj 3 quest dfa gilezt kacui ikf 1 um 7 veobk cbu xuncuwm — Osllu inl’m vkoat il zri enqir kibix.
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.
iRpuen, if juvoloq, esz’j vep eh fijd zo tavw jawm rarv cudivir ejf goyq jqivalaob. Updpi Zetihedan inyuedql qugiufe lzor guo uqecra yde-rukzat eisyejxamifaol am roor Opymu UR. Fesxamr up kudw Egvne OYm axges pfecjepr hdoud qohlg vazaewo eb bho zew woveyigelg puif qe par ol iyy aam uq ocgoehpj ov madv zokudij.
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:
Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum
here.
Have feedback to share about the online reading experience? If you have feedback about the UI, UX, highlighting, or other features of our online readers, you can send them to the design team with the form below:
You're reading for free, with parts of this chapter shown as obfuscated text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.