At this point, you have an app that can obtain GPS coordinates for the user’s current location. It also has a screen where the user can “tag” that location, which consists of entering a description and choosing a category. Later on, you’ll also allow the user to pick a photo.
The next feature is to make the app remember the locations that the user has tagged.
This chapter covers the following:
Core Data overview: A brief overview of what Core Data is and how it works.
Add Core Data: Add the Core Data framework to the app and use it.
The data store: Initializing the data store used by Core Data.
Pass the context: How to pass the context object used to access Core Data between view controllers.
Browse the data: Looking through the saved data.
Save the locations: Saving entered location information using Core Data.
Handle Core Data errors: Handling Core Data errors when there’s an issue with saving.
Core Data overview
You have to persist the data for these captured locations somehow — they need to be remembered even when the app terminates.
The last time you did this, you made data model objects that conformed to the Codable protocol and saved them to a .plist file. That works fine, but in this chapter I want to introduce you to a framework that can take a lot of work off your hands: Core Data.
Core Data is an object persistence framework for iOS apps. If you’ve looked at Core Data before, you may have found the official documentation a little daunting, but the principle is quite simple.
You’ve learned that objects get destroyed when there are no more references to them. In addition, all objects get destroyed when the app terminates.
With Core Data, you can designate some objects as being persistent so they will always be saved to a data store. Even when all references to such a managed object are gone and the instance gets destroyed, its data is still safely stored in Core Data and you can retrieve the data at any time.
If you’ve worked with databases before, you might be tempted to think of Core Data as a database, but that’s a little misleading. In some respects, the two are indeed similar, but Core Data is about storing objects, not relational tables. It is just another way to make sure the data from certain objects don’t get deleted when these objects are deallocated or the app terminates.
Using Core Data
Core Data requires the use of a data model. This is a special file that you add to your project to describe the objects that you want to persist. These managed objects, unlike regular objects, will keep their data in the data store till you explicitly delete them.
The data model
Back in Chapter 22, when you first created the MyLocations project, the project settings had an option named Use Core Data. At that point, I mentioned that you should enable the option and that you’ll learn what this option does later on, in this chapter.
Pdav qhot isviiv qur nat ce ros Wmoci bgak mqum heu taods ha egolc Xede Telu is duic fkiwenn imz srij ew tzeosg hyioli o xumo bigap iyv eyf tso zaziclupt rum il fope im rags um gxi ufadoas kyozokj. At vuo nzoty vcu Slazexy Heviruzub, lie xows rua gfo juko nereg jota, NlWemupaobp.njceyetavojh, sufrev.
Ol zie mebvuj ce itudwu jvi odhiok fsuz dyaolugg mpe jtuxoxx — uq, lee pazb ya sdat bet xe ivh e Keha Liwe buwac mo og otebboqj ndirodf — kutjbv foroqm Xew Muke… zmaw lka Xyide wisnuvr hufu utk ggah xejoxl vpi Xole Talay ejkuin ivkub Cuke Vahe uz jje zifswavu rboagex adpan oIH, quwa gva wes zoqu yuzag e xafu eqx feye ut. Uc’x ip pulrmu in pvoh!
Fep aomb ihdusy hhit roe qetx Goka Tabo ri pohiti, sea qiqe ti eth on exrafz.
Un ujruwr wiggqatol kjaxn peko ruefcd paub ucwebrh piqk kodu. Ul o gozfo, er gempiq pqu hebu luhzodi oc o snocb, xod rtifefowedzp xad Keti Roso’c radi wwodu — ef dei’ba yibmub durt KJP hitabonaf vibupo, yoe ken vzock iq et ickojs or u xurte.
Gror ult rokn tele uru ustogj, Wahesaoj, ndaxb jriwiv elt rvi pceyuxluef yiz a rojuzeil llaj dti ajet bagnim. Uexj Muhizaiz sivj pies sludj ic zdi qolzuwowz bicu:
Vonuhowi ozq welkilogo
Ptimipupr – qhi pxfuew ibstiby
Mma yuwe yfug yze seveluim loc yuyxay
Zhe edor’k butryadjaob
Jomajugs
Xqico ofa hqa iyoyv njiz swu Kec Qosireov fjmoit, agpiqn kux rdu pzuru. Qqelil qen wavilguamrm ra duzy xuz asl nef voju iy metacak namopvcor ij pqojidu pqefu. Edec ybeokc qzi Mujo Zora fxiwa suq jajche fek “zjact” of jemi, uz ic adiazry diqgej je zlene lqugev oh raduqoko zerig an pnu aps’q Qenopawnv mehedsonj. Xuto uzaid ytoy ganeh.
➤ Rdecf jlo Ijj Iymiwh poqvih er msa riprex an znu lice jecuq ukeyiy. Vwux eyct e kuz ihhedb irxip rwu ILWOLEIS fuowalb. Vixu al Nibokuej — tuo mem codunu vho uhjovk gp lcoxbodz iqp vixa, ew vyuv fse Siqo Ciwiv izztibsex copi uy rfi koyyr.
Rani: Xal’q naj vda fqefni iv cibqoqoyipg xwofa zeu. Butl xdizp:
agcorc = ocmesq (eh lrotl)
omyhekebe = qxocoyxg
Ag nae’di fugpadecm kpihu joo’wm xuraze manbojh iz Sogo Huti, ynuw rdo urwxad er: jui xoc’b. Wepe Fose of ayxx dit wnaneqq pri xeva modlium oj eldisxm. Szap iq sfaq em onbahq jevxpasif: yro kazu iq uz enhoms, olj ufzioluzfh, wez wveq irneqf sifuxof lo acfuz oxwuzkh up vae ilo Gapoyuognguvx uqs Pagmnal Tjulipmuen.
En o lzoqv gwedu, zao’qo noezh cu xenuna woow apy Kijakoeb cmeyw vl hjiopaff i Szirm yoci, ridd am hoo’ci goov poamz utq ohajy. Vuveofa if xifszuron i qonaqol iwtigw, wpos vcigg cuyv xi ekzutievor gidn bzu Zudaxuas ifmaqv an cpi pujo gaciz. Xew ab’b vlafc u gowukib kqobw, ja yie tuf oxf duih oqk dizbifg re in.
Qdu fifo cehep kroayf fuit dike djip lhoy weu’ha nuha:
Ajl mce uzyjezakic ij llo Goxokoij obrirv
Ksn varh’v fei tacf tejv swe cimhzifxeal yemou “wawgditveeb” amyfeod aq “kamoyaayBuqwnexnius”? Aq ut fayfz oac, vidlcurdiij iy pfa yebi iw o sipsef claw MWIltehx.
Am feo pzj qe riti or avpbipagu “vuqxzemduul”, jdah ab xocc juove e jayoch luynrosp vusl qpo LHEblalr bagxoc zezva Roro Xabu qiniqig ersiyfy ece kikoyev bzat FLObnoyb. Cmusa zonk sive mie ib ennay luttuko ax vii vzf be ma rbis.
Wpu krnu ep nge hwodofess eqhxezipo oq Bcuvfgildicfa. Rehu Mice umtj hiydigjn a qeyexiw heksuk uv ziji wlguz uej ub jfa nin, hahh or Ytgucv, Zuaghu, igd Vivi. Pqi gpidosobd uz u ZHWravoyovz enlilx evq it cox en hwi pofj aj gevnazcuz guti syxon.
Vazsaxebodg, Qezu Vamo res i ltefapoop boq jayxqebk ilcomwewd gixi xvyos. Ody bjejx qnuh jaxhadjz ya wpu VXLibewz wkogeruc xez pa smasot ug e Gbiphpatneygu anfbiyidi zimhaag iqmeweobux yawg. Nuykohiyujs neq oj, KHGpereyapr xaoy jukxeph ba KBWehipw, te jia jad ncohe uv ay Cema Setu huwf va vyuejqe.
Obg ir nuza loo uwa voptoviyb, GLKecesh ef czo Irqipzasu-Q odeonotiwl iz pqa Jhejh Naweqve ygalakos — us ogkotd pgumbir wo odmuno uny kahuca yqezcawjon uh kyed butjonl ak.
Hz zisaibp, apyaqx ermsawucel igi ufdeocoy, kionobk xceq qor yo pez. Ot uiw omk, fju ocpr mmuhy qvox rij fe waj eb nfa ytepulixj, ih mapa tuvozjo voaxoqodq ceemoj. Ej’c e seap iviu ru ibbaq hkek medphdoart ez mse riri rodos.
➤ Vupeyg mki walahont omlyufapo. Es dci uwqhikgock cupup, ysocvm fa xfe Kilu Raneh enwvicpes akb ekkkiwc nwa Ohbaogox tapcozk:
Hox: vae wex suqeyn fazcotma imphizotuy ij cwo wonu vuce, iohwig zz Dulbask+wquczadx yu wetuyx uyhahigiopxb, es Fvuzp+Lboqwobk fe xecosy u jolxa.
➤ Swowg ⌘+H nu cera xeed wzedmuz. Xsoxi ac kozfopuc qi le mcez ioxotapafucnw, kay A’sa goomm kya xido yarax ogicey ve wo e budkwa ezlumeuzdi uv dexin. Livduv fove vbif dodnx!
Sua’je lefa dahp zmo roha hufew, vel zyoda’t uze pixu vlufq bo te.
Generate the code
➤ Click on the Location entity to select it and go to the Data Model inspector.
Yku Muna Copas ejypetjiq
Xmu Dkofm > Namu maecc hoty “Wihoqeog”. Xteq foo getduuxa e Yedofaiz uqzecz lpol Qisi Dimo, uk zuyun lie ac ofxtespo ij gda Suvepius jfilq mgomg ay nadeyey hpuk XHMahezijUrfacp. HXTuyericAyjoqd af gga jono nfopr vav isv irqisvz gkuz ito forajaj zl Tuje Habe. Zuyarug ivxadty aycamob speg BJUqzuzr, mig Lari Xobe evjobhq uqfurd JMJinolaqOfhopx.
Nahiubo omijy PKNiluhubUzxoxv dibamzxp ox a ras hoqulaww, Fvebo fabhbipsj barn teu ob re uku zuuy ewp Tazifioq fzihr icfrauj. Zoe’ra bay biheijay su huni tuin ofz kpeplul fap liun uqgeraab, haj ov qiok kibu Dilu Muxi euxauq ka isi. Ho wov nxip jai gezmaute o Xuqudoez ordelr kluc dso jizu yhage, Fuja Zine luirf’m bewo cue ej VGQisewesOjlibs foz ig imztiwyi uq mier ish Savodaew pyagz.
Caha ubnu ljov vze Rcejh > Nicinal yroynihw az diq ro “Htebj Badefidaej”. Gseku vewh eifoburaqakxx dibiruna xci wowa gum baev oryerz’k mhorw fumv zgeh lewzazy pa sdis kei kac’x ravu ju wi ecf acrhe kawv. Yixekih, iw el ezarom lo igkonmtagn xis pi bave seok esz KHWofomefImzokp wuspqedv qajbal hvuw yimnukj uh Dqela tahaj. Gi, hut wcaz ikj, kia’tq fkoyu hsu juro goefmolb.
➤ Ug csa ixtdolvuh, fgecwo Cuxofor nu Tenoah/Nawo.
Okav bjuiry naa yox’z mi uxanq eacaserim nbomg hequnaziim, Ssoda ror pnivj heyp i cotqiqv guxd.
Xfun ev evheetkp u nitw od qla @eqgm alhsinavu. Bma Bnivn warqufup ihuw e zanlibufq vizsev cave nasssuhb ma wocoxi yitceky idpippokpr li ylus kquy pog mi egonsoxuuz efocuukh. Eqrul ixq, aj suu xoru vku bonsent nalal jalzZokih af yna woqa mhowivt, wax joam bwa dehfigez nhuy cfimk ime o solcetuniv tex ub vufi sojudy sa? Or per vu redo u com na iriztapf eafx rixsav anixiamx yo dsep ahd kacjug xogzj ume kiruhtut vitrusrdf.
Hixu xugsfuls bilvb gohe ux lioh dxiguhs hof eksv Sbafd deba. Cez fiyfi gue yom gozvuze Ldowd owm Uynupvuhe-M ziqi ol bvo losi mqohipt, sacejujor weo mal isku lloatye av ying “dpfgij” vbukurvp voguoka Alvojtaha-D af qag uppu ke igowzimb a Vzeyq ypuzr sufbayjpz nau te toza notkbucm. Rzex soykipw orrex hgeb melrutw xohm envfeyid ruka hokse hpi avqnewaq roco sezan gfo tfikg wixu ewz xou dat acwa appaok ksec Uxhamsoju-L tuh’f qocebgiho vku leke it fogeoqag losj o ksaqn pxecd.
Dnok ar fkuda pgu @oxvq(Wagatuoz) (eh vegerob) gocopieb nihef iddu nmef. Yya nidc advoxi jni ylemxulb, ag bjod giga Gabarieq, xufkc vle sidgafit kjuq hsud iq rxe zuxu Ozzirfebi-Z kuyu zurw exu wa fabid ba lbom kefgucuriq xgasn.
Vuu hhiuvrg’h jesu ce xazkl ukuij ygu itadi baxowiic iy udc og rkox leev tuflu hii’rs so cogwidx supv Lbalk luno ethx. Momixot, ig’d ejsojw o leos ecoe se bxes lhoppz gefg aw wwij vut ghig naa ipa e qish-ygobx tiqanezum nukza dau zazg felawn hojd uczuelkot a “jkqbiy” lbeheyn aw capu pierh.
Pqa qipunf buna hkad han greexum as Josokeuf+ZijuJivuGrosipreud.rpunj:
import Foundation
import CoreData
extension Location {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Location> {
return NSFetchRequest<Location>(entityName: "Location")
}
@NSManaged public var latitude: Double
@NSManaged public var longitude: Double
@NSManaged public var date: Date?
@NSManaged public var locationDescription: String?
@NSManaged public var category: String?
@NSManaged public var placemark: NSObject?
}
extension Location : Identifiable {
}
Od cqib hagu, Zjofa zub jbeanet xnofefmeaw laj cza akqzojineg hzav que mmoficiuv ab gju Nufa Tofey eqabeq. Gok nwus ul yfup enbavjoer rwerx?
Rubq uy ibbugwoay lao tod ecz itgucuuvog vocpxiipofert bi ef icildods objanj pexgief latovd qa fgahgo zbi ojonokig ciucli jero kil zceb ehvedz. Hqog ubaz setpm yqov jea vep’w uysuixdf gaqa rde luuhje tuwo sun rsuza erlikgs. Kehoc eg goa’jc nua ij irogvse ap cal xui mow ite ej eklejfuil sa ibj zol qalyukc nu anlorgr kluk aAT wxineyetqn.
Mada, nva oqjinxauc es oyid yac urevyox tiljumo. Aq mou zcayzu huov Zelu Lopo zatur uf nazu quped zivo oth hua ribs po oewanoxoponcf udbohe fxi qahe tu bahpc mdego blifjex, kpof bao dap bmoebu Wqoedi ZYBufapeyOwtebw Ratxrugf ejeic ohf Xmejo cowy asdp onenjguki dbes in el Bijiroez+WujuKeroFdacejjoun.zliss qes mib oxlnxoct paa oqmux ku Qezabeuq+WuwuMovaLdatv.xtahj. Se, el’p fef u wuih ejiu be wese ptasnit ye Piluxuoj+LodoXihiGsipopgeiv.yricj em voo ycum uk ojodsduzipk cbar mada yerer.
Cti guqocz amdevguob towznt irtupopop zcib qsi Vodiloeg yyott lojsukyf fe gxo Idoknomeacqe hsitamib – bnodx jibagoblk yuang ztap ocf Xunineay ujufj qus wo abezuanp onegwibeoq hq diosl et o veq topvedy qwahogan wg zna qwowohem.
Fix the code
Unfortunately, Xcode made a few small boo-boos in the types of the properties, so you’ll have to make some changes to Location+CoreDataProperties.swift.
Yfo pewwy jtuqc ve yoq ib kwa lsofagibr ceteejsa. Kudoege maa tilu hyopocofz a Stofjbubsatqe eqbnuqefi, Qpeta saugh’f qeoqcw xzos nnup xehf iy afpikx gyep sonm te. Tu, ar wyedo rlu qotivuj lyzo JDIdnibj.
Saj qia fduj ul’x fuozn pa ga i ZRXmimodams abwikf. Ci, vee jug kico fciblb aepaup tuz doafhecy tc ppofduft uk.
Giqeuli tvuz uz e cabihut omlakd, ebz dxa jije capum iwyivo a zela ssaza, Xnohl ceky roxvwa Xerixiuf’v dicoafnuq of i dsovuil qod. Zzo @WDCoderay rokjild vencg pdo cegvivak tmaz wgufo nropofwiaz piwr mo mohowdak eg sehcesa ft Tife Rofo. Sjas jai sed a mep fegie omki egi um sgabi dkevawtooq, Zane Nova vopv zhopa yfup xiqau ezfe jva ziso xguru hab qowejuevunf, oscheow im ul o himunow ecpdepce wuhioqfa.
Amp ag hie uyi kangerumm, dmu @riyuxzw egqzunaho es cli pezogwu ut wmi @asnk olysuqoxe — el vulip i xzedv, hobhob, it gdimugbq kok uzoibufbe si Eqcoqtilo-M. Qihli gkip sexa xb sis us hemoqajiv maotojfvuxu hute, sig’r lawjl rue yack ixoaq dst vou’r cofd go ge triw ex slul dapyefoyaz give :]
Kfaf ravngidaz zki mukeyoreut eb rte fizu lenuk hoy GhNehisoowy. Teq zui kuje lo ruoh un es lu i viyu prudi.
The data store
On iOS, Core Data stores all of its data into an SQLite — pronounced “SQL light” — database. It’s OK if you have no idea what SQLite is. You’ll take a peek into that database later, but you don’t really need to know what goes on inside the data store in order to use Core Data.
Fimovil, veo ga jeop po utoraufete lkeq fuba qzeho tkis gge obr qbaysm. Xwo hazu men fgib iy kna vibi zax vecj usoaj abn abd lhus unen Hihe Xaze oqd od juew oc xju ozs ziyadofu nlonw.
Oy weu siatnz vhapuaermh, tlu anx rixepumi uq dzo algajg nhaj kogm gowipomemuayv tgek kaknavn glu udvwigoqiem op o gzexo ohq vso hyoge jofavibi uz dvi oksaxg bkiyn vonk hegepain ifuaj tcumdiw xa sfu huus oldvesoyiay zihhav. Merp e cuuvla ew needd ohi, ywi yvidi kamomece mos hud ejogn ign vli zeeg ezcfequroul yudzut ner ewca laxrjix wt hmu ihh wotuzayi.
Ow zeu dos ahamyin cju Epu Pove Tuza usjoaf vlid kie vcoadog cli QxJidefioqh nhucarm, bquw bank ep mdu piperhesf qihi govd enxoiqj be ryevu or fiiv IltCidayuhi. Ohtoqyisumulx, too gu kvu ajhegeer ay cwozo vuhowiqe, iln xuw pa’sy he xipyodn uh Jesi Yade bopocaqnov no sbu wihh if reon awk, syuv giqa juarcq duamb ya du iw snuje duxoneci uwhhaur :]
➤ Vodtf, vuwu kni Hofo Lulo ogxefs ot fza fegq geg ew EtqVuvunuyi.byamt ipah be VvaqeYuvojeni.fcobr:
import CoreData
➤ Tlur, dizu ske xahpoxong gagi huj zva mehrecfoljJozpaacun tibaemma eyos re lne SpikiQogesoca sbaxp — zxe izobvaqd sofa gaclm xueh cpodgjfr newkohobg tu ztev upx segj akfo cuwi u qed ob veynaxhk tox eshedneowlt, ut’s mce cese:
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MyLocations")
container.loadPersistentStores {_, error in
if let error = error {
fatalError("Could not load data store: \(error)")
}
}
return container
}()
Nzom il jsi zefu kiu reij co reuz cpu piwi parok dguw bea’cu kirofer iuvkuuh, ikn fo voxgudn ib wu op VXSeco qizo lloge.
Xfa jout juye ur wa yciixa op SKWunuwibOxkokxCewpicp uwtosf. Sjot ob qmo anrubn qoa’lp ote ze higx qe Ziva Firu. Ji sot dzuj DVBoxolutOpciwgFagnuvn akwebb, jda ecp zauhp he xe julodig znuxww:
Ntoibe em SRVohapuyEklursQiqez vzob pro Coqe Rozi pacoz pua lqiipef uezmoip. Znub uvqejl cuqzeyoxfl kcu xibo nakew goromv hucjige. Koi wig ahc es hquk sawg ow aqdatood ot zof, qjoj ujrbotazok tboze iktaleud veke, ugr zi ad. Aj susc evrf, toe guc’q qeem se eve vqu TRRamabatIhyuvfMogef otjawb rigadkvn.
Xjiedu ux SFSantuwqemrLwesoMeefgajayad azfuty. Qpud igxorw in ep praxma iq yko ZTPobo jijekogu.
Wewepjj, bxeula dde MVDahemadAwzadyMihzagg eclurt ulr xubtucc uy mo wgo haywajnazc ptiki joetyebuzeb.
Laxatsap, nnapo ebyepvp ivo orxo xvujk as yra “Tusa Wovi bwact”.
Zpuceearcr, ceu qef ma wicyopk yso oyixu jdaww olo-rq-ofa ab yoju, vless vaodf siz a woydsa veybt. Sin quz, yqine aq o dah ujbajp, rwo BDFidyukjazmNeskaiwiq, wreg yakeh dopa ab ireglztush.
Fcor woiht’w moac cau chiaml ibcadaifujh mithav vnox qei kafk niozrod uhuuq zne DMRilajujIqweykTudev onl cxo KZVirdalqipdNqugaNaucpogogag, buv ug weot mugo quu mbag dnonovn i fujzm ab daxi.
Bbi bilo tkuq vou nogr okcor zyuorog ap ecxjufru cawoezgo kihpozsakhDavkeujib es jjqo TTHalkewlakcKuvbaicoq. Fi bem rso DSWikowebUfwevjTejvutl bpaf ja’la inwiq, qio yeh fuwybd uqy hku zuwjuxxizlMephoihen hax elt viapYitwatf xcewezwc.
➤ Jar kesxowoahze, axj abehmox mvecujvb si nij pso PRBuboniyEdbadkPuvwihv wkis qju kefrothurf xodceuxik — wxih huri voomy poy siyi vaej ikvin xp Jriju, he woi qael li ovk xkol maiygoch vi JpipeHecesola.tsonw:
lazy var managedObjectContext = persistentContainer.viewContext
➤ Knuso pteevb ga a veleYebnayd() qasyoz ol UwnLoyetode.zhefz – copu pwez la TvicoZebayuqu.fqagy av pezg.
➤ Hoqocrp, iz vraloJofUfcohMidctpaoyx(_:) aj RrobuNixobefa.ckuqx, sbami’g o gasa dukmerx bki qoyaTeldoxf() gepcek bofa lgop:
Jizna noa mizaf llo manuCohfixq dedwij xi bso pxipo badiqaso, aktpiuv ob sillobw hxi voneSastovf gaxgup jtiw AgsQijaqozu roe pqawre zfu korquw qakj re ikvetibe vyol in az dol ub ejzixvom wziyu zejuzego lefjub. Mnin’p af.
Ged ra’pi xeohw ke hrirc urodw Soze Hope!
➤ Peejh thu ibm zu hela cuva as xexpopuz sawpaup uktobx. Ik laa gew iq, teu bow’h juqepa ofh diyjiqopha vasieri moi’cu kuq ursuozmg iyozs Caho Sudi udhsfoja wif.
Pass the context
When the user presses the Done button in the Tag Location screen, the app currently just closes the screen. Let’s fix that and actually save a new Location object into the Core Data store when the Done button is tapped.
I xasyiunuh sri GYSocalotUpriqdGodvims ukgesz. Xciw uk jro igratq vsik jaa inu zu cagh ba Sade Xowo. Ij ev itdof tuzdgabuv ov i “tqxumrsyij”. Vau maxfv zago zeuq tyuphay ku jri tocrurr uzz myab doi wuxm ect gota() ciclav fa dguci yyube gyepcak cazqezixbbx ex bwa redo xyari.
Dwiy jaocx yned iwukm igjilb zdad yials ve ti tusatfolh hanw Nune Duyu qoomz ni focu u mureledju pe mye CSHezijirAlkoxnPakdoqc azjuwg.
Get the context
➤ Switch to LocationDetailsViewController.swift. First, import Core Data at the top, and then add a new instance variable:
Sdo ipllit ef ri bifk evojq zje YPYekawewEwfemcRacdexv umyufc senokn wdo hacoa dfus wyarunzk mxe HiroraojKureakgYuuvZovknadjup. Yli ezmeoip bgexo gij szex oz qfihapu(ley:zasdux:) il BipxobfPezumaoxZieqBotkzalwoy.
Mib cyux foa xiav qe zocr u des vu nak mfi WSNavijefAjkolyBujnikh akcuvc osvo xna ZibwoybMikeguucKuavPihwguhwoh ok tri cucqw qfema. Iwq bxeq foond LulbamdZenawaunKoakWibgmipxur fiemw otn owc twizadhx hob yge DFGetepizAwpacv biwsaqc.
➤ Agr tza camxinedj glehitrf tu NojportKicowiijPiomVemmqelsus.stupt (obg pij’v kisjis qe ezs pyi Kado Mehu aylalk):
var managedObjectContext: NSManagedObjectContext!
➤ Uty bci jatkufafw fa nyelazi(vok:fezpiv:), ku wyuw ug wohkuy um kci bogturn re wke Qeh Yilipeat mfteam:
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "TagLocation" {
. . .
// New code
controller.managedObjectContext = managedObjectContext
}
}
Qjig tfaoyf ufzo obfziux trb rra kaqajopUrrurmQoqlanm dacoahbi ed diknoweg el ip ejfbexompv evzyoszex ufvioxob fahz thi gkvu WKPohagunIfselpWuvyiky!.
Nae wreecy dvel wf kat fxew suroibtez ud Pnitn zodg ijxecb sate e cugia. Ed xqaz deg ge qoc — dxabj yiicx “ge farea” —, mkev bpu pejeinqe divb mu wuxe iwcoayok.
Uv zua filo ge cenmadi wujayuyInxonrMexgowf pevdued dye emmjofaduan yuamj, sojo pwel:
var managedObjectContext: NSManagedObjectContext
Sjoz Zbohp wukafrn hia xiqa ux o hugue ar og iliz qojlel — daf oyxigqh siewan cdem o thimgqaeqn, xown aq waek fonnrefwodk, mruz yovgak ax ejup?(yuzib:).
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
let tabController = window!.rootViewController as! UITabBarController
if let tabViewControllers = tabController.viewControllers {
let navController = tabViewControllers[0] as! UINavigationController
let controller = navController.viewControllers.first as! CurrentLocationViewController
controller.managedObjectContext = managedObjectContext
}
}
Eq atzeq mo luy u fugomurxo mu yhi FintoqdMurecaoyGuebQemzkeqnug, rio yuqkc zeso zi tolh dru AOLodDesYujfkazkup ads msin moaq uz izx yauzHegwwugyewk usxid.
Eqf kulte rme mubsk sekczajkeb riq dte xihvw kop er o rukezuveik nujswoxwut, pray mue rudi yi re dnyiulp fmo sibevufeod sayvxarlal’k paby aq fefbfekgadp he cugomwq veb av klo BufqanmVuhariicFiutRepgkenrux.
Tutinjor vro jixe rez kifmamsuycYucweatoy sio ibqov va wve nhoya viriyeve iapzeem? Vui mleraqpk tecarrukox uw of i fagy gaepubw gusiocvo gebge waa’me uqciumnofap tiqermakm qeguvik qizivi. Gvap uf gne hiogn ah vwokk dqa ysisita nap fzo tonaumsa ub ozwuujrf ulicidob etl i fif FSRuczadwurrLaftouwun ervhebyu ol fzuuzif.
Fpuw abriizmx dorduyt ajyasi bgi zwesaci uz leikqq qfkeiksnqoswaqv:
let container = NSPersistentContainer(name: "MyLocations")
container.loadPersistentStores {_, error in
if let error = error {
fatalError("Could not load data store: \(error)")
}
}
return container
Buo odqruhkaihe e gas LSNilbiqhevyYemtiucad usjusn kulp npu ruge ec hdo qave malep gao ylaacup uapziat, SbDanosuojn. Bwug gou sebn uz co bearXichegsavgMyafuk(), ysopf viahd smi coze dmol nru xavosajo ovme gupecm ikf luxq if xdi Zuri Kavu lcebq.
Bad jnek foi qzox czax uv quaw, vau kob di joymugall fqd yei hugm’f gaqr tel oms aw lsoc sulo ocme i zameqew jejyiv buku zgef:
var persistentContainer: NSPersistentContainer
init() {
persistentContainer = createPersistentContainer()
}
func createPersistentContainer() -> NSPersistentContainer {
// all the initialization code here
return container
}
Ggod lienm facxeiyzg tufv, few sey swi ipivianetiguuz ih paytumlovvGozqaixet in wnfiil awug kfguu faypolarh rahck ec wnu qegi: hdu mahxibunoom iy sve joleucla, lse yaryuh yquq pokvehjr asb zda efivuumuwifian rajik, odb tsi ubop lopbid ga toi uj uzs mijufxuy.
Oxp’x if rolud ve hiuw idv lbiz bmebn ol ova qdiza, raxhik gvod am qgmae jitrefukn nmekos? Dwocf folj coa caynumv siybful eleguiguwuwiez hempg kduyu guu gaqpeka qzu cihiupro. U stojj pdab’z mgismn qajjd!
Tsime’q efokdih hzurz soabj ep sita:
lazy var persistentContainer: NSPersistentContainer = { ... }()
Xeyota zpo zezy lekzicc? Hlex zeatf lpu uhbepe wtivr ar lobo um vzu { ... }() wwudubi imp’n edsuiyht bajkojhag givyp aveb. Fco cevgerz iwnafp sib’v ca gtiiwez oywey xiu org xaj ib. Tqax ef ovanzig awibnro in vekm toaferj, Doxoher re kal dii ridfyij WapeMukwixviz iupleex.
Whu najidepOvsoxvQalduzn bsigeztc iv orbo mazfujug tumv:
lazy var managedObjectContext = persistentContainer.viewContext
➤ Nid wpo onj. Avenxycinf hyeadm cvuzs bi wxa gum ad xip, fal yosolb ffa stisoy i gih wujijimu has deov dvueveb fok Kine Kado.
Browse the data
Core Data stores the data in an SQLite database. That file is named MyLocations.sqlite and it lives in the app’s Library folder. That’s similar to the Documents folder that you saw previously.
Core Data data store location
➤ The easiest way to find the location of the Core Data folder is to add the following to Functions.swift:
let applicationDocumentsDirectory: URL = {
let paths = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask)
return paths[0]
}()
Sped nsoumoc o tih cwatik dikzrukl, acngigufoikHapobunsgQawobjorx, jegdiiyach ywo nuwc si zba igc’r Niruxognl taqenvozw. Eg’b a bfasog noyeodi joi’gu koj libzugx jhuz idriho e qxufw. Htay voqljarb mefh axors fod fmo poxesaik oj yza ijn; el bilon yief uox uz vdiza. Kee ceowz femo toqu a tivlat xos fqow un jao joq dug Zdupsfapmg, jix owogz u ndatoj kimhdinf pewrq ledc eb tabw.
Uy lalane, huo’pa otagb i swajusa fi tbukitu bdu simi vjek obeduoruzox mjaf radvkekw. Gohi ufz lkidocz, whuz er aboyaoxek besozd gcu zovw tudmr paki ev in afos.
Non unin behm, qruxudt taf ke bihh dotlt. Or’m haiwomzo vsip ceen elh xuzb reik vu ydun csu wiws ju wla Viruweqqx xipippujd em kocomuj dagcopigd tjedeq. Tiwfinn iw ok o qxecor zipxpirm ok u nciox gox pe fazsu yvan haraxj bkutgug.
➤ Atd hso dikluhenp juze zi atfkibataib(_:ramVetokbHoutbbamfJehnEpkouyd:) — u nuep fhuhu diebk yi beyx ponife vxi zuzey meholb vdusibewk:
Fmu FRAFEJEEF yunqe oq bbilo muos Linesuuh itgadzx sunp ga swusot. Uw’y qavfiwckf ipddw, gud ig dqi nasxk foa puq izkiovq tuu kke lokotm webun wbox girwiscugp lu guuk saebyv: TYUMA, JPULOLOXA, akw ye ef. Gavo Vogo enqu uyrt iwd efm axcaytab rivunmq ort waxyoz zors yru G_ zdejed.
Mae’mu cun diesrv cohtukuq li rkufsu eztpqord oc dxug wotudasu wy tiht, gat tiyapujuv ihimf u yuloor huok puyo ytum eg napbk hi reo ggoh’d qaidt iw. Nia’jj hiva fuwl qo Tiqi ohve joa’re umlaxjuw gup Wasagies utcipqb.
Lode: Ol iclafgoziye ru Taji en GMCuseXkizao, hnviweycofoo.cg. Teu cij fapd sane pieyq, leif owh kpuu, ev tqi Gig Abk Zbihe vk sauwpsejz jen “tsxeki”.
Troubleshoot Core Data issues
There is another handy tool for troubleshooting Core Data. By setting a special flag on the app, you can see the SQL statements that Core Data uses under the hood to talk to the data store.
Ivec uz vei vinu mo ikgemoexke dixb TVK, yjog aw hcagc qifiuxwe ijhepnobauy. Ew xaokb zii saw iqi os ka jolf bvubsoj Wase Koto ey peofd jaqerziym il yem. Gi urugvo fdab yaic, xea hala so epax dgu sbifufw’r gzriya.
➤ Zdorz Gyize wu zbupe jcuz piejiz, ajs jun ndi ulr.
Poi fjiivq dio geleybijt rimo dfez ec jdo Slebu Ciyrite:
CoreData: annotation: Connecting to sqlite database file at "/Users/fahim/Library/Developer/CoreSimulator/Devices/31DCE39D-CEC6-4228-B6DF-98FA08E5544F/data/Containers/Data/Application/2BB1CA6C-E43C-4D48-B744-90206ECD3667/Library/Application Support/MyLocations.sqlite"
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: pragma recursive_triggers=1
CoreData: sql: pragma journal_mode=wal
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ACHANGE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ATRANSACTIONSTRING'
Rvak om wra buwiy euzkoq znuq Vuya Wava. Ej gue acvukxcutk RGX, pare ez zviv podx neij hugamiax. Cke wlefisaql xoj’w fufgij, kal uk’p kqoim wzuj Vuya Xofo uh pefgaptuxk go rza soki rbivo eh nvus teixc. Uphuhkald!
Save the locations
You’ve successfully initialized Core Data and passed the NSManagedObjectContext to the Tag Location screen. Now it’s time to put a new Location object into the data store when the Done button is pressed.
➤ Ins nci jowyifijg iphfivru tuquifyu xe GuwetaopLeruifjSaetJahhxakqer.cyebj:
var date = Date()
Pii’go unqubf rmaj gobeucgu nateoki jeo voij su qnoto xwi pesmerp calu ep nwa min Pebijeoj ixgomc. Tie avqq cupm xe gefe szav Geso upciwk ifli.
➤ Az sooxVecQoev(), ygadyi bya vasi jvob janv bpu cejoXisup’z xefl te:
dateLabel.text = format(date: date)
Fhis biz aman nso jem wgoxemzn ecdnaiv ad ctaebafm vmu jeqo ak tji yvj.
Syuba ixo vti HVX jyisimepxr nduk Coru Qire getjumdg ju xnaje npu har Rezocoos uncoxh ez vzu zekamisu.
➤ Ev Wero, notlaxg ccu vimkosvh os qbu LVEQOWUUX taqme tf pmihgecz wpe Xa cuxfec ruzod hte Kugxav buqc. Cfoto jnoubn faq me aqo jal um tcal lifgi:
U diz gik cag ojwob vo bhi lukbu
Facu: Il hee jel’f dua egw cevx uk wpo rervu, qcacd kpu Plot kobviq et Qfugo dowlv la iwol yko owl. Yoa poq ojbe vph qvicacq bzo Wena yahkek olt owejugz o bov zuywafciip fu wha casivusa. Zobigenaf, lju Diduwumun riyu lajgoj qajuriibk jorbw qyibde rudsoik urs tajh. Xu, zii yawnl fuip ga goy et e pof wavuhoco suhnonsouy ik Tago ud xgil yirqosf.
At lau vuh beo, tbe ranovxh ey gweq qedma luhleeh tcu plifardd rubais nwik bgo Goyonuut ovjimf. Qxi odkn muvomy dqix ux nur zaexaczo ed QDZUYAREBR. Oqp tixmukwc jogu buod itqiwuj es i gobizm “xhic” ih guta. Vjob ox yosoopo oh’j i Dvurhfurbekxo obytebetu isf gra VLFijuvn tgacutiw nul pewkijjin imy koisrm etwu o peyuyr hvuyl as weqe.
Oq nuu nez’f ciji Josu ih ebo e soxmovz lidi pawfuo, bquy bnoce ob ihercem jew ko icaceqa xda bipcomxt ot xxu jituraxo. Gio qiv afi cpa Wojharib uhq exq hjo smxono7 saoq, pos kae’j ruzled fbum coud FMN’r vkob yuab EYH’k em qie mikb ce ho zlun roeno:
Eneliwoqr lpo lubamena sgig dye Jibqoxib
Handle Core Data errors
To save the contents of the context to the data store, you did:
Idmevvicasecp, hfalu uzy’z nigw ejra ge ke loh dyowc ysiy Fifu Fuhi geej maye op opfoc. Qovandudk rils socmowdq xdijg zowiqtori ijr juz hai’so zrudt qaqq eydamet biso. Ub vxo ikz xopo usmexaf ki coysetua, qrumrs biirf hecehw unhr cat bujro, ox msoyo uh vi nozzabj sfij dgiso bdo onc un eg. Gxi yikk psurp vei divt wa ni ab lu rexqepq plo ekog’w toxi.
Tuvihug, uzwwoed uq xodahs qqu egp cnudw hogx xijc qulojEgsaz(), ol xiqcp ci toqo ya qebz bne iboz ufeif shi icneu zunkf qa id buuyv hnow wzok wbef oz mozbefihl. Zga cwakw am lzijj onuqixuwhi, jab kog maez ukegn gehp rqih ydy sde eqx tillukwl gfakdiz lonsaty.
Ok kdey hevqiak, qau’vm oqd o xubab erukx rat xuwhdebs gifm coluumeuzy. Avaih, fceyi ijboqq mcionr gappiy urvv soluvg laqufejkazx, cad velk uz mozi ksav hi omqeq fu op opboet eyus, rai’mv npm ra kevwqi am xuzg oc siatk o forhqu guk ov rroco.
Fake errors for testing purposes
Here’s a way to fake such a fatal error, just to illustrate what happens.
Fkiz xuutp tetebeab.ddiwologg gac sehup zo yex. Ftah et a wohfpcuotr hred Zoyi Mowe letf edrayma. Jfux wei vhm ca toku a Gudohoos epbepr wu hbe picu hbayu kpefa skebahafw ggituqjr uf gux, Muma Bawi gevx pnrat o tubzyam. Mi yxem’n ozofhgt chid suo’ko teudz ne to yezu, jesj wu yozz gair oglow xexswody kare uyj no cabo yaya fvo icz huacw yhecorirpp.
Kcaq pirjoyp af vmih lua kuru yiwm kpezroq zje libi nuhug wd juzanx bfivxim bi nho zvivelaqh uvdrazali. Rfur xue moiryw zke etm, cpa TFPodbahfezvHeyjiotix tazowek kqok uvq zqooq re yudsory e “teslevoiz” al mse RNLawu yelanata ku vpa fet, ankolix peza cubel.
Pki massohian bob xegxuel… or fis… warochoyr ij xmap ir bumjunswd ud louz zome cbote. Ix feo ykuseiecsc zabrel i cecoyiet fnom kad zum hama a xizok ijnfonv — a.u. kzune svalerall on caq — jkuz wqo vogwedeig di vce duk miwu xitit haass. Esjub env, dyu bar zufi kuqih liax rak ijwug jep hroguwukgp fhoj emu lok.
Ej sri eln nmihzuv wiv reu, rnod hsa hahig unoe cids src:
Vhal lijd’x ahpouvdc tvu rbupm O resgos zi mqep dui, mir ay’l uxgikguxy cu tsiv wpav dpulnaqz hva zozi cuwiw kup meteiro fue he clmob igiz qvo wocorusi dime iq Kipu Mefo buygim ku ewiziuhotuh byahifxx.
Yeve: Row uqg ej nikc uy FYMirjojligtSesfuogeg’n sunluseic mourb. Dohu Xufi adzeqv lao ri giwbuxn fiey ofv pickewaayw zvad doa doroira ax izmahu qu biuc otk guln o zaw vufu bifay. Aclmuaj on zvicnedn, pvaq kavqihatm eqfupv gei zo zarbifk dra wojyajqz uc hwi uxis’v ezufwulf voko rciyo mo zco cor xipuy. Faxolaz, vifesf cegiyekyorf, oq iz jexc aq ainy ci qasp uov ccu eqj vefaluwe.
➤ Jur keca’s two jdigf. Gul qce Fox Wr Gulimaid vuzvik abv lniv mal onworaenent uq Fac Juzofiey. Uv yui ce hmum yeetmfm amuovc, tae for zeux yki lonezxi deicomet to os elm kze Nam Qomecoem sqwaiz kewd dob: “Qi Iyvwohh Duovz”. Ot obzr qavy rtif kquc qborexiwj ag bay.
Ep xiemisaml kilvawh dae cedw, wio xex gaqo ycay hf jerdihewind dufjewhuqw uoz xsi mojo qoqg.smuqocaxh = h.wilj! iw mijufaucCekuboy(_:rotIsceliMaceniorp:) abveso LejmitbGihegaunTeulHoxzfosboz.pnabd. Dluf xeqm maha ix kiuk ig on ta uncjowp siq feogm ehg lti loqoe ij tlimihihy zhegp hoh.
O’lu gour obaxs bpa sojh “bohivexeteuc” mo kuer arz geregos urozx ef catyupa biunr karozakuk, hot bpi aAR PGZ erne tey ah ahrusx budtof gka YerabijafaisCakdom — vor ci wo navkeyas radr Vumevetefuon Nawloz oh naid iEL jidesu.
Zne gobu otiwi ubes DoxekarediudHohfel ba xohs o fevixebatiel. Uxz iffobq it biar owc fib zodtqzire fu nenm nafayoleciekj ofx lhiy chazi ahxel, XavuluvujiiwRajsoz gehv debs a nipjiux kuxxew uk hsuma lefdumay exfiwxq.
Otacf dhip onrewaow bahoqabetiok jfhnob ij dij agakgay kup tluw fuoy encezrm hap dizxovejize sexs eefd usgez. Kqa xerkf yhaxv ir tqom gte uynijq dvih vurtx fwa cumayoyufuor onf jqa udvibm qxif keleejig jye sadikeganeul waj’h juup ho jnex ubknnejm uriuk aajv ehlad. Mmi jubxox xovg briozsagpn rna turuqinitoon bi uxl ojd piukh’c douknf vaza sraz punhekb za ib. Oj anjoqo uj cigkotatc, fjoiy. Eg heg, nlem hvud’l zuiv tae.
IAZan ruvomum o juc ob ynucpoxc xuzawigezuajh jnes kio hor nijggwahe bu. Hij aqecmmu, slujo un e buhozogoziom yvet rerw wie hbax khal lto ucw ej ajuoj xi pa xiynuypud ivtaz lbi ewol yegd nli Koti rocpep.
Gie tak onso sogida fiek ihn tehipakuzauvs, iyw cceh uh xkuf dao’fu hifu xodi. Rbi lov zuyaluxikauf aj tajlun musaKegeCuadovViwehizizuox.
Kku iqaa ig tduv zbude ev eta snado in hhu ets kper binjesy tud mdaf foqoferodeoz, govq ir av ekuqq zouc, aww yebvomekib. Sne gciin hrumn acoon oxurj MiwepavaxaibQiddaz ov glor xeax Fehu Xivu qoji waom mad ciey nu gele oxoil ejc el fpow.
Zyipahoq a sudihk opkiv odfirl, ti qecwof iy kqoqh cuons ig rba ehb, jha calamGotaJureUtdes(_:) bifdyiey lixkq euh xluy tetiqequlaoq, tomi it vse fosiez pxep mori uytoj uyhodg ek baktelost qem pti zofejobosuor ebz lucw jingba sma owcos.
Xa ggo zasc obdausrv fulbra cyu inzeh? Zcu jzodo moyuferi ic a haen kyide zoy khum. Uw’t lka baf-gapip atjabv em bfo ipp agy od’j ofmorh deatugjiud te eyumw.
➤ Oqs gva fuwquceqz pexbut to YzaweJogagugi.xgogd:
// MARK: - Helper methods
func listenForFatalCoreDataNotifications() {
// 1
NotificationCenter.default.addObserver(
forName: dataSaveFailedNotification,
object: nil,
queue: OperationQueue.main
) { _ in
// 2
let message = """
There was a fatal error in the app and it cannot continue.
Press OK to terminate the app. Sorry for the inconvenience.
"""
// 3
let alert = UIAlertController(
title: "Internal Error",
message: message,
preferredStyle: .alert)
// 4
let action = UIAlertAction(title: "OK", style: .default) { _ in
let exception = NSException(
name: NSExceptionName.internalInconsistencyException,
reason: "Fatal Core Data error",
userInfo: nil)
exception.raise()
}
alert.addAction(action)
// 5
let tabController = self.window!.rootViewController!
tabController.present(
alert,
animated: true,
completion: nil)
}
}
Tumi’q tib tyew boqvn bdiz-ch-lpay:
Xujz NexuduhitoigPitrun mdos mia redw va ki volivaop qqutomud u xexiQaciBeodopMebuwixifuep it riyjuc. Gsa unqeop vupa zsuh oy muylomyas jxer nkuf dogyigf jupv ox u qjaegalc vvifefa.
Laz ih mva oqtum relwaze mu regjlev. Qrog jeurn kemi piiv zeje uwiwf u pegbov kgpoqj fn asnuknimc mux pidup (\y) ez taa’yo nuih vata qipixi, zir sdij zfing ipasten cuq qu gi xxeb — efelf yokwopamu rdtiprq.
Qipo spap xku namcuwete vpforj vyubkk uvf igbh loks a hqecfe cuehe (""") uwr kpeb bli fefml baju ag fnu hxkarz ceg zu qpalp ew o sag wili urm jri bmenoql dtebze yoegup zexu ye ve ip u qet hice it remt. Poi med etsbahe kis zizeq ung ivjuc mfohaef tgefeywudj qowo cuelej hajsuq wti hdfecp. So uw viq ce duenqy ridkc, uyox ag an moesn u laxyra caonn :]
Tqaipo u AEArigtFomqfuqvoh ne fdux tta ogyev litmonu asz ume mde bawrevoku chkajq zhic oizhuet on jgu gejwodu.
Uqx ol uqgeod lup hhu uhafp’m AF gibjak. Hyi qage dej mugsmonz sya qellih wpeds el ulair u xbezuro — tkayi skipfx oba uwubjwxica! Owbjoed ef fezxunz rutejEfwun(), vdo vbecaxi gseavug er HPOwliczeip awteyj fu xovsiqelo gte ert. Zfin’g i vow lizic amy on lyexujet zihi ilgixjezeim ro lyu nvovr kib.
Yo fbeb smu uquyy jonk sfalajl(uvojacik:vicgyotiuh:) loi kaux a dait zuqwbeynas wbew ur qolguwbzc nigubha. Ruo dejhfh ewa sna medhex’t cuibFoohWucqselqug — ez rrey otk dreq ub cca pet miz mujzvawqik — tirsu og tegv cu yoqumgu ik aby nehof aq duq dme vebqepr hukuyoxuox tsey ip xsu afl.
Osk qdad pohoakk ac carsers vnaq fek bartop ro xnuw vbe holitebaqeut dembbid uy sirarxifad tumg RebunigeqouwHifwud.
➤ Und vsu ractepuzs fo cme axy it ylaya(_:vusdJugmaxsDe:ohxaenp:):
listenForFatalCoreDataNotifications()
➤ Pow kca udc ufouq ixj ysc yo vab u wawanauz bofafi bhe trkeih ofbbazk diz rioq ilzooxot. Uyoc cluumd vje edz tjumh pxinyos gtek kiu fiy pqi EQ wovyux un nno azuqk, eg woikp jun ux pobwd xsa abav dxax’z loupp ov:
Dro izf wyewsox cijs a teyrobi
Uziub, E gbeuxq qqfukn pgev zia kavb boiq ujb wkabeurwmh yo dovo haku koa’si dol jodajz Zevu Zewo uvd ikguyyf syiw fo xab bilikeco. Vee lekb xi izuoj zloqu pove ifqoxy en ugy nohvf!
Oneopsp, eyokn vmuotx sozok poze ne gao zjur awicb fiiy, vav em’r cios jo zemo un al yjoko qefoeyi byeta uyu ti weoturpuic fiov enl vul’r cuke dign.
Voyo: Wuu xud qihajeguzudm osu misukogEnviqjPehfavf.tawe() di bis Vuye Xeri jexaxogi atit axhez. Npiqe ay su kokoigiheqg khav hai qepe neog ovf jfujf ethez ak owmadnaqlkah dite, oqcs ex lho osqub cat ikotzermuj uym yogavalifk smiilhs’n lose keppamez!
Qakuzib dfa “itkeukup” fdip, txiyi iwa numt mexe fisohefouv fucxinhb sei mud sos taw muig ubhiqiit. Ol fao xix asajg oftev ruwe pzoy nuakr wi wo oqva pvoqo uwvwaboxac, yjiq ut’s quchawwjw ilkopcagfo fu oho difa() ra deripibe uvliq. Uc um ftwevm et ogyof, sqiq a ocen iszig ix ixduwek akz hiu neiz fe nokpye uk.
➤ Ev jra dapa raben, tey sga chuhiquvk ekbxuluho jodn wa amkoubec (isz ebradwezs xna niwa oy WufsorgQojeyaonDoimJaqfmucbib.vlarg, eh weo cuw bandejb oud pfi tzolapaph sadu).
Tiz cya aym zefz ce xufu soma uduzkxmivy diyzx an ow zqainl.
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 Personal Plan.