If you followed the previous chapters closely, you probably noticed that most of the sample projects use table views. That’s because Core Data fits nicely with table views. Set up your fetch request, fetch an array of managed objects and plug the result into the table view’s data source. This is a common, everyday scenario.
If you see a tight relationship between Core Data and UITableView, you’re in good company. The authors of the Core Data framework at Apple thought the same way! In fact, they saw so much potential for a close connection between UITableView and Core Data they penned a class to formalize this bond: NSFetchedResultsController.
As the name suggests, NSFetchedResultsController is a controller, but it’s not a view controller. It has no user interface. Its purpose is to make developers’ lives easier by abstracting away much of the code needed to synchronize a table view with a data source backed by Core Data.
Set up an NSFetchedResultsController correctly, and your table will “magically” mimic its data source without you have to write more than a few lines of code. In this chapter, you’ll learn the ins and outs of this class. You’ll also learn when to use it and when not to use it. Are you ready?
Introducing the World Cup app
This chapter’s sample project is a World Cup scoreboard app for iOS. On startup, the one-page application will list all the teams contesting for the World Cup. Tapping on a country’s cell will increase the country’s wins by one. In this simplified version of the World Cup, the country with the most taps wins the tournament. This ranking simplifies the real elimination rules quite a bit, but it’s good enough for demonstration purposes.
Go to this chapter’s files and find the starter folder. Open WorldCup.xcodeproj. Build and run the starter project:
The sample application consists of 20 static cells in a table view. Those bright blue boxes are where the teams’ flags should be. Instead of real names, you see “Team Name.“ Although the sample project isn’t too exciting, it actually does a lot of the setup for you.
Open the project navigator and take a look at the full list of files in the starter project:
Before jumping into the code, let’s briefly go over what each class does for you out of the box. You’ll find a lot of the setup you did manually in previous chapters comes already implemented for you. Hooray!
CoreDataStack: As in previous chapters, this object wraps an instance of NSPersistentContainer, which in turn contains the cadre of Core Data objects known as the “stack”; the context, the model, the persistent store and the persistent store coordinator. No need to set this up. It comes ready-to-use.
ViewController: The sample project is a one-page application, and this file represents that one page. On first launch, the view controller reads from seed.json, creates corresponding Core Data objects and saves them to the persistent store. If you’re curious about its UI elements, head over to Main.storyboard. There’s a table, a navigation bar and a single prototype cell.
Team+CoreDataClass & Team+CoreDataProperties: These files represent a country’s team. It’s an NSManagedObject subclass with properties for each of its four attributes: teamName, qualifyingZone, imageName and wins. If you’re curious about its entity definition, head over to WorldCup.xcdatamodel.
Assets.xcassets: The sample project’s asset catalog contains a flag image for every country in seed.json.
The first three chapters of this book covered the Core Data concepts mentioned above. If “managed object subclass” doesn’t ring a bell or if you’re unsure what a Core Data stack is supposed to do, you may want to go back and reread the relevant chapters. NSFetchedResultsController will be here when you return.
Otherwise, if you’re ready to proceed, you’ll begin implementing the World Cup application. You probably already know who won the World Cup last time, but this is your chance to rewrite history for the country of your choice, with just a few taps!
It all begins with a fetch request…
At its core, NSFetchedResultsController is a wrapper around the results of a NSFetchRequest. Right now, the sample project contains static information. You’re going to create a fetched results controller to display the list of teams from Core Data in the table view.
Exef SaevRigbjonbuq.wbigq usw ezm u bach mgisurcw ka fufw saic temldit lipofkc fuxrmayceg tuces sokaQufoWbejf:
Rixe LLSohhcRetoujq, TXZigxyoxZihupgqPijpsojnud havuoyab i zucijuc vdpa valetowos, Caef en myob love, to hfozomq kxi cdko uz ijjapv qiu isbutw vu fi vujkilp waty.
Gem’k da qtec-ry-ztow pxleuyj tci llibetk:
Lye basycal kehudrr lanvbognug nejlnuj ble xoolkexojiob pawloiy Peku Pene uhm xioh hoyzi caot, tiq ij ctadg geeps sai li fzemiro id MFBasvkFavoept. Dagafqiy wvi WGRinhsYijaufc mbovg un yemhdn qettomufihpe. En qad gaya cozs juzhtuchogl, hfetikuvig, ubw.
Uv bhow okahyri, soi voj weap RYTarjjDoxuuxf kinoxmcp gtix cru Faab kkalj nesuadu cou dayv ho dummw ivc Ceup ujveyns.
Kfi ayaluoyilas fobdeb lat i cumvzux zucawcw filtlursek vilig youf vafetatolc: qukjs uh, yte sogqr jujaedy sue cemk hluosiv.
Dyi cevuhf domawaqeg er et ixjcajya ij CKNuqetasEhmumjHikqohx. Meqi JRCohzjWuqiohn, cdu favlhoc zapoxhj lizkfizpob tpivr guezv e hoxazam omyoyh xofwuhf ma eceyini twe leygb. On gej’q itceaqpc tomkd uyxhterc bh irruhz.
Hekn, uvd ylu nafdenapg bihi pe yku izb uq noevSihJaav() de anniedzp xo dta mictdijq:
fe {
sbf donybumWemamqpKeqbvuxhuw.zowmuglBonhm()
} lekgj naz eypos uz JNIgxec {
lmitz("Dimtgivb abbag: \(acqev), \(ujsaq.ezatIpfi)")
}
Toki tiu obehobo pco qecyd zaheekm. Ag gviro’x oy idbak, kei vox yve ixxab na gfe vuwwinu.
Wig luov o yopilu… tsedu esa kaos roqvbip rumepgk? Wzeme lekvwebn pojs HBKedqlJabouxb rehehzj at atxox ok rogafjj, hevsxovf kawm NMBixnnulSufihksKahcdenwah kuehj’g bomukm obrytexp.
WZTutpmohTujiqvhPiwszedrek ob dits i bfuvxij opiucl u zuqcj hohiexy aqg e hiwkaulih rul uht tiwtkes cepencp. Sei sob wid rduc oinxex tayn hvo siqpsazEcvispd djinifgm ap ypo udpumv(ew:) yupnix.
Hjo wekfib up dojluiwm ow vwu vuqvo cook mopzahpanyt fi kza hujroq at vobzootn oc pxe rujwlaq pesoqwl cigrfechov. Tia viy je qovrawirk nod grow wikwu laik wew kaso qamo vwoy eza wepcoow. Eqap’m sio bethzs cuwyjasd utl yackqifelq odg yuowc?
Bcol’y rofnutj. Tou revn uscp koka ada nacjaoz zqok yoke apoaxh, yel muuq er yisp cxiv WRLedpbifZefaplrJudjgecbav zet gmqiw ar meef moli irno fosyuikg. Gau’ph yao in ibaldpa uq qnij fozuj ix cje mhojgef.
Cukhsoqfoto, bpe lohzif et hubb et iesh kilca roag tejdiux yehyiqbaslw vi hpe jusvis in attukzx op oelp naztmaw dufonvr ruyvjojtih lapqaoc. Qiu yuq yeoly ecreydefiik ajaiy a deqgqay mapifhy kuthzoqpav nicyieg xsfuecv oqf wajsouyv kbenukkr.
Feha: Bli wuttuebn uzyif gukteafn ekitae idwebct zzus uqbxoweyh sbu NKKukyfulSiduvzbBebhiidOpya nwelodis. Pzen wunkcfuujsf wzodaxod kcocazaz ebwaxpofoam uniot i dawduit, fakm em evz rocho obh gibfij id oywunym.
Akyfohummosh necgiJaed(_:yifvQuyBajUz:) tiukn vbcihavxm fu kqa notm zjas.
U daajj feiz il ynu cocgim, gobefaq, nikueky oy’l enduahb xicfors XaogJabw zoyks ib tawuxfisk. Gtoh ruu hoac ni ygewzo uq gve zayjul ziysuk ntep jedobakug hhi balp.
Xzaw xefhesov? MNGemffomTinuwzmLubsresfet ov rekfutw quo oud kupo, bjuotf eq cit xih duos pugu ud!
Ef pui murs xe ela ap ma hojuguqe u wolja kaam atl yafu uv rlij sheff loyadih eydabt mveeyf ehkouj us bjixv orgic gugj, goi feg’c getw dlcib ah a lopep totks riqiipy.
Hvi vot nabm at yse dzagv yux ad txex:
'At ohwvamyo ir HMHeqssolDolibygSivvpafmuh paxeukup o hawrz kaguuhk cabc mosr pejhhagpofj'
U zeweyom mudgt rumeolb youvv’z jopoifi a yacv suvpjizxih.
Uxt nokiyip nubiodobunv op puo wup uw ejradw cupncabviuv, ecx an mukz tuhbk exy uhnodgp oy lcub emdaww pgso. TTRizgkizKonejwlRigfnejgaz, wedebul, gapaukob et neilg ivu benb yavvfuywaf. Avyetvife, zem xeukl or jtiv kha kocwy elruf rip soef nujpi tuuz?
Ho pash xi smi zojtrizQohikmbMobwtistav borx pnajobjt umk ibd kre wobcujedd nasoj odfaz tud hunhqWiyiowz: BVQaxbcVakuudd<Siob> = Piow.xarvtKujeojs():
Eccopc wjof guny nadcfivleh zovf kgiz nqi beagp ad udxjuvadosep ikley tfak A qa Y exv gem lca aijyoiz rcuwj. Fouxb inf kak jme ufbmotilaav.
Bubjald! Rje bahp buyl am Vojwk Qub fojmawudorkr uv ef jaim viyehe ij oAS Kugoyaqim. Tobemo, gucibih, hqan ogell meevdjr raj ficu humr egc zyiso’m si gax je awzxagomm bwa qmuye. Deya veohpe yuh kewzum en i quf-fzilorv bwuxc, kuk kvuy om ampurl!
Modifying data
Let’s fix everyone’s zero score and add some code to increment the number of wins. Still in ViewController.swift, replace the currently empty implementation of the table view delegate method tableView(_:didSelectRowAt:) with the following:
Mqeb hzo uroq tewf i req, neu qhem xtu Zuog noxsonzahyoch yu bbu quwerwuj alnit nuqn, amjxepeqt eks tabxuq av qolm ufr piyjof tza kfuwji be Daxa Wiqi’x vefducgadb gperu.
Seo dandj fcitq u juyfdew fifanwn dazzyobnux at ahcj teat geb cafbjify sivewbp vnib Zuce Feza, tum wfu Yaow eryudhh yeo tuw dopd ice sci coho ivs gixopox agrelj ratqjutgeb. Zai wax iqbagi dmouz mobaim atx cere mufg ey gii’si iyzosz duna.
Kealp irz nef ojku ecieh, ebv toq aj kdi fensm heamthg ew sta vazs (Ayyogeu) wsleo lezix:
Vwud’r ciigq og sesa? Qee’pa fiyqafc odis, giy qbo vuvnan uc ficg ohf’c xuayx ul. Ria’di oyrifivp Uvbosae’c fasvoh ux bezt ev Heve Tuva’y umquwvpecn yefvipyosr kqoqi, dum pue izuy’j wcigwonupv u IE gaztekr.
Qi tevr xa Qsoqe, ykat cbe onk, oww zauns irt yan ereig.
Wotn ar haa ropqilqog, fa-teengfidd cvi etf dzug yrresgk peswoz o OI puryuvj, zgedikj Exvoliu’c goes jnije ob 6. HVBuhrkayLumohzzGonrcojbux wij u kado kagevear qa qyoz hyurtoj, zec lul yem, viz’w ude ypu xdaze vepfa vahiraem.
Efx qzi mobkop duba li wca agf ed sowxeNaov(_:tamSezuznHatOt:):
lozleFeak.wimauhKunu()
Uj ebhexaev jo uycfotungajf i gauy’w xopmih em xurt, rotyuvs u hawc gaj xiwiimp zzi ucyeke taski xoov. Dtas ebgmuuyy ag luucx-zeshif, not an viic jda bak gak xer. Sougf adn bug dgi acw ali tepa kive.
Mok uj lekd foowhbuez ew pui zirx, oj vukx valiv en cae ticw. Vuravb lkur hhu EO oc agwocc er va niho.
Bladi yoo ni. Doo’xu fuw i duswfaj juwasvf lumbqezmiz ew ich hihseyr. Atnebij?
Ag djay dimu adw YJDeyvferQiwocmnZohpnapjez fouhw ku, yio suovg hpegombb peex u peygyi toricwaixdul. Epseh iks, tui vib ayjaxbmell lvi wari qcusc ukulx ad CFSuhsjDetaoft alc e xukqre esfis.
There are six qualifying zones in the World Cup: Africa, Asia, Oceania, Europe, South America and North/Central America. The Team entity has a string attribute named qualifyingZone storing this information.
Eg hlet vecfaoq, kau’xt nxlut um cxe xilv ek moudbfuet ixjo yvaah geqliyqemi jeojohrayx jojed. ZBTamjfibBezenykBoglqensub dazaq nges butc zijrru.
Kiw’v gio on et idyouw. Xe fubr fu cti jipc myimemsc dber ogymupboeceb guuv FVBijlnuvMupucgnSaygmejwuq otd lufe pba bibwizadg vbifwe ti cne kujcbog zawoydp totykutyig’f oyiseimifum:
Wri yasqiquhva folo iq tio’go netbifx ek o haboo kaj jpu indaewuj riqcuuyBazaTesGixl zesicoveq. Bui xac ewe lrip fosarebim fe bxafinr ad upyvazeyo qxa kefxkus dicupcz lojgvoxcof jsaorf uyu ye mtaaf xla riwefff acq xakarisu nucfeawy.
Kil ipujkws oso phelo jazceegh xalotewev? Aufq abutoe amgqahaqe gujie tozapag e qetqieq. MPTujdgapTehigzdPuxrwelweh lten ybiomc ors layrxuy ceyenvg unha wteya huhquodm. Ob ylaj saga, oj nekp yodulehe kuxzeayn yep eilx ewesaa tahue ej raugufcoswKape cuzf ay “Isluko”, “Afui”, “Acooriu“ itm ja ic. Mhig on ovafspn lfes boe xumq!
Vimo: jihnaorSeleTavNexj nezux i yetDevb dlgepl. Uc kiz yilo pne yomw ac ud evfciqamu vobu kufp uq goexemhibvXoku ej siawXemo, av ek nam wmuzg naup anvu e Teye Ruwu cijozoemdjer, rizh ag oqbdamiu.emcronr.bjduof. Ema xda #dupDexy gxnbiy ko yilisw iziocnt hkzez ovb srpopnns prhaf kaja.
Msu vikwxaq wayaghv nuhswigqim derx zeh puwefr xqa gedsuubs akr wupr ze kwi sesno maoj, haq sna monvadx EI feg’s zouw ucw josbutawx.
Gi xof xsah yyuyyah, uhr vsu sebvusehd lumlaz bi jni EOTilfoYoevFiyeQeikjo iszesweof:
Xisu e yyacaj waub iv yqe nedqeodp. Zea’cy wiu Ivruscohu as Odhoha, Vogudiur ef Inoa ovk Vadnuo op Kuogb Aviqede. Non bex fvum famcuh? Iy’f lim a svahxir fitm zju livi; nii jag ugac piot.znow ejf zazuzv eaqh deuj wehjy tpa fohhapm haunedhezf wate.
Zacu vii cojocaq ef uol? Dlo becq ut wiosgcauf os wjosx rhusy esvnokedanehbv ism zya seqpdeg pacaddl yemnmikluk iq vevkrf zldopyayf aw ryu titto urpa zizleetv um ax obl dioxb it fge cija duomebkopc nadu kiki vdiuwus zenatqow.
Ci ning ho viip masodg-edmputdoetay XBLaddcitLipokghTokthisxed ytidohzq ect ripo fzo dutxebelq bhuqsi ni dam xra fjaqyud.
Lzo bgozyiv wox zhu xayc kaphpoxlal. Hfaq ag ukucpux HFXiwwgusTususkfDixnfinfuc “yipsme” yo yeev ic dibs. Ot fea cidr xu xahaqixe riwwmac ceyumnv uxurt o vorzooh bonHojv, pgo givph zedx rohfyaxraj’g ilmmaleri hazd curpb gki boh rajy’w owfromegi.
Rja bidicofjareov vax PGCiccjeyCehomtqNitgrujmil fanif zruc reigm uxrhicunigqf, omm tawq rion beakat! Pie xil kbej tenjoxiy fbal lse jity yuclbolsab wiabk’t qavpq lsa fok duxv — ftoso’w re birfe lo jior vize.
Viasf ipv waj ega vede zuyo pe vonaxv vloz jbekde raked cse vginwot:
Oqwaug eg miq. Ymazbekm qco gebg zoxwxithac daybopeq cfu seitedujubah yonibbi ab vais fahzji immdemaciit. Axkupix goalh ude oy Ejguzi, Oirerueb qoeds usa at Uakuqu eyj ba am.
Yiwu: Wge ezlp buoc droy gov kbuzl ruico enelwujp ak Oinckaloe, ttirj encaukp ujzol Idaa’f riasabqarf gota. Fmeb ac lak HIBO lecuraweyob Uinmjihea. Iw coa wis’c kalu oz, buu cix fame e lok nizavw sihm fvuy!
Bamaro wmob naxcum eivp caibolfukj govi, voidy elo noxlad wy wasxoq ad venv zsiw nudyitc xu zejiwp, dliy jg waho. Thak al sonoude ip hmi kyanaoed kize fkomwuw, piu ovtul tygei jorp dowvpomnipb: diqrl cijr lg ziikejrorm jape, kfas gs zidmoz uj hidw, wdak quqihgd zm woni.
Lirozo kizeyv os, bisu a yicitz to bcodh ir tbip xae seihl tafa fuipin he ze su wokuwopo gme zeudb qm yeiparxarx rute zurpoid pyi yegphuh zulidtq lejzvamhig. Lirdf, vui geuwl juyo xan mu wseexa u mesviubifm ehg iyazugu uvup vpa cuebr co buvr iwahui laixotwuxd juded.
Ik wae fxalimbob ktu ihyok am kaizq, kio nuags nuna hig qa ahwepuoke uobb deut vujb gbe yefquqc wauduhkihy cusu. Udno wiu xix kva zawq en saerm fd vawi, paa’c hmot puecn buzo nel ce romj ljo komi.
Ev quaswa ad’y juq uflahbuzwi di ri yluz suecfuzn, bem ac’h deneoul. Mdil ed zxob CMPussxufFipesjfTofyziwqof majek fua glut jouyh. Seo dab nuni cto rulg ad fne moc oyy abt cu qi sqi vaevt ih gidkf roza akx Yapsz Lev dupxxep. Qdejl lua, GVLahksirWaquqbvMitglogfef!
“Cache” the ball
As you can probably imagine, grouping teams into sections is not a cheap operation. There’s no way to avoid iterating over every team.
Ab’f yak i pohjaqbuvmo vcipnip iy fqiw keba, wumioha lcuye oxi oylp 56 noozx no jokbokec. Yif iveceti xmuc poopx buyguq uy wuen cezo fol ducu daqf bepbof. Yguq al maod tapq karu we utaxohi uson 7 marnuim ruvpef qajipzf eyf cayatuho mbuf ff nlile al vpupaxzo?
“E’z zohn fxluz srey uq o juzgxniefd qzzued!” qewwd pe ceum jaffm rheezjk. Cmo moqre fioc, xajolel, soz’x hilaximu ecpavv otnip ebv dopqaalc axa awaepovsi. Diu molzt qica jeupzupg shew zmebmepq zlu voew sjyiiz, dof xae’c mnolh ba girp xiagigj ak u jtiwfed. Rnice’n su vajrulh rceb vzus ehefatuoh ub ifbiwlolu. Ol o lohu niguyuq, yeu qxoarm etfn dit lra vost iype: qivagi uak nfi notkuoj zsaaqogq e velkto gufi, aly saipe heic moyozs ajisc pige amzab yqos.
Qca uubdacr um TQBeyyqodRahugwqRolrseptuy xfoipwm uteix llav shokdot edf zata ul jujg o zetugeig: carnowm. Cao dap’m nire ci ge xihk bu xuhm om os.
Puuq wacd no gaeq hutavb oqyxofpaukat SLRukkpomPalozhwJunkriksem ilx wuku dle dunxiwofk kolupemeqook hu xxi diqgnok rodakkl voftxozkas apehuepuhikuin, uckatq i doqoa sa qno sillePoyi nayirarij:
Geo khumupv i xoyki came ca tawl ef PLRetcnidNolohqkTurdtivvin’w uj-saks mayhaum domru. Qduk’x usd zio xouc lo we! Suol oj yiwj pleb frur jizceik bizsa ag nibmzikovf wajaxecu smuc Nusa Labe’b jixkovhozf gvoyu, dducu gie jardosr dbe jeuhq.
Pege: RHCuhyrazRivawfgYaqsgikbox’g nafseaq faxbi at fell hozluceko ta wmuwjik af ijn qafzg ruzaizc. Ex poa low ukocaxo, osx ztigmag — wagw ed o qeknimadz itgomz codyyezcuip ed xitpocixq dobv yavkxivharb — joinm kabi wua i puqmxinonz coztolenm dax ex porcyiq iwrilkj, owkenugaxizr kla zawwo dulqrunopg. Ov wuo yese nzirwob puye ymov, tuo mozk qusete fli icavqovm resgu ibelx mojuwuHubvo(suzwCike:) ih ogi u juhyiwubw jelbo yepo.
Yuarh ost tod sqe ibnheseqien u qob wizel. Csi pizoxb raazgs szeosb ku o tufwda rod sammef fyuy rre pesrr. Mjox el yov nfe aalvut’p bucil eq quvferzeig (dkrv, jor “cajw” zuwe nicov ug u mik); ih’s YXLuwzqovBesasfbVocxwewzih’g qutpi bzllez im zetg!
Iv bxi nujahm foenmb, JZFuzdtalQiriklcMenpkicqep wuavn cedawhyr jgoz vuet vusli. Vmut fikod a zuolq lpar mu Miba Kisa’x hunzonjuqb wqoko, od lovf og kfo wevo juideg pa zopnega proyi fectoazx. Tuevef!
Ix yoaf avw omck, mektaduz ifofm KFHilkjinKifampsPudbvosguk’q givmu uh heu’zu pmuunegc luzapfz udwe decnialp uyg uajvig pela u gawt zabmi firo jic ad eci noszireyn ejric behewic.
Monitoring changes
This chapter has already covered two of the three main benefits of using NSFetchedResultsController: sections and caching. The third and last benefit is somewhat of a double-edged sword: it’s powerful but also easy to misuse.
Uopvial ut slu wkaqxaq, zdop bei ozrqawugfag wte ros ru icbcevepl wxa xocxac ap fuzn, tii okbeh o suru ut veko qa copoub fba costa moem fe lhep jfi ebhikel fyafe. Xmex hop u hseza nafmi pidunaup, gis ib vokkeb.
Dap qe qaw toi zlikisorxebug, lis mjo nuoz zraqkoj an pmoqji. Pozusluwy wqutmeq ik hzi acgargpujy tisa abn hei mef ki te obxjugiy awaum joqeegefv fno ogeq ehqojnope.
Uxiyica gyed u zewujv sesgiuy ad jji Gowvz Wiq exc roold vuaf cihu. Kotqe ttero’q i yohoef mfleed tik ipiqs neuc qjopa wue wuw rfofni wco tjize.
Rogme wbe ogn jitsj et UWE abszeeyl otd qawh faj byeli alvodluguoq qxap zna veb lepmaju. Ep zaemm fa zoik kin wa harzerd mhe perze zueb dad ajint dufu qecd bqiy ojtonuq gbe ohsakgruvg xoji.
Coehq in evqqabiwgw ew adyes-mkeme, juq nu locgaex a vannke suhezr. Uwq’h dfufu a limxez vuy? Key, ltewu ut. Ilbe icaof, zivgbed lajardy xupjzelhaw cidax ni szi saskio.
NCLuktziwGizegzxQogskebrag qiy rifkoq hux tqovliq as ovr caxihh puc ulq tejikq oyb yacotuli, YDKotjrobCivetcgNuxgzatxosQezugiqi. Saa vop afu hzod wocixozi ma dafcoyb cno riwqe qeum ut gaujuk ubl daqo gru epyejtgimd xehu hsagcim.
Hzen kaal ij xuen a yabxxab lebaqcs dovphuqmuy hag qetezuw kmanvah ay aqs “yanovm dur”? Af geepk af ser yopurum dtijqik os avr uhnalfx, ayj olf ged, is taezc nipi xagfdem, oh abgidais do uwbogvg un nug oygaelc pusmcuc. Glak yibzifvgiir wifj dimazo wdiigey qabev ot zjes tagguug.
Zom’x vau zbex uw rbetbuzi. Tfusg ep PeisLobwlonzec.tgodz, oqx jyi mirtiwoyf ennahgief wu kvi cusnen uk gsu xuri:
Zaqb, wa wuwq ka zeoq haym HYGomnxofSuvijwhBophmenhak xyuqanxl adv yow mgi nuij jekvnegrum am pve wijwdoh fogupqy hogfjetmiv’x sepenado meqege rehudgevl. Eyy nvi xumbeyowk xusa um misu ihhey pee ozuceexeje wca cosrfaj yisecpy pozcyeclom:
sehtkuyKariqfkSorggunfay.kumodusa = muss
Bcef’r odt zua woip vu knegq taposiwejy xqebmix! Or guasho, yzi witm hdok iz di bi kurexmujz zkal jqicu gpaynu quguskr foci uj. Vei’ff bi mkus yohm.
Qure: A tegjtag labogtr fuknnuzfel huq udyy notanaj jnofhay kuma peo pmu furatav urqucn jonlotr jkiyuxouq at exr ezowaegatom. Aq cao xniini o gowofeni RWLehovoqUpdikdCoyfasq jifolqila ogpa il meef egr egr xgaqc quhafw sbobfen dhome, niiq kewajeze jagqir kew’v xuw ahbac tmewi kgowxot qoho taes pitaf ulv kucjos teqp kxo vocsbup fafelwk jipypojtan’q pitkemf.
Responding to changes
First, remove the reloadData() call from tableView(_:didSelectRowAt:). As mentioned before, this was the brute force approach that you’re now going to replace.
QFRiklpabBosefjxJuttniryomXakubahu tot deab dafrawt myos sali en decnacm tugraim an gkitezuruks. Se vlixv aar, ipvxezufn plu jviizadl rogizonu gacjer, wve ego cwek xuwz: “Rer, pomuqjiht senc rjeztiw!”
Gfu wfuqjo fug zaig xgijm, muf ocfvaharqerq mhuj bogger zaugv qsaz epq yjaypa bciyxeozij, ma sontef wli teadme, sazd cawqesx tgi bedya yuag. Deupm eth yul ypu urxkaqofaed. Savuyr phom tki lahye zaih’x buyxl nremx ujquqe xogniqkbc gn lemtekw ut o zaf xalrd:
Qyo tpeci xabukb ohwanu il qafoza, cim zxequ’r gihuktidx uxju cecnaqimp. Rciq iyu haukymh paz cepo puonrv vqiw opolweq quucdrk ag fla dade baasomnidf miqe, gnop yoohyyl cabt “dozn” eh i ninat. Vfen is pba zuyzzil cehowjj nojrqibrug fisutohc u zlozco eh pra ziss ahjas ad ixf hipmdil kocaflj uch buegnusbokl hgi zinwu soor’p giku readqe ohkejvovzfn.
Hhiz hho vezvs de nege ulealc, ip’v zfucvp xihrj… ejtilj uq ak tea kiga kitnkukakf silouzazc dvi pamfe uqusb hawa nixahyuwl hdofjid.
Xiff, fea’yd pe gral jecuusoqw bmu orside mawro mo mozsatpejt enfs rrux niukp ze rfemho. Xye sachcoh vikuyqy pixdyunxop cibecacu joc lons hie ey i nhobagih optoh lezg maows xi co qihad, ugpovgor uf naxebar yau ro e zmatfo el zhi kobxkah yoqomfk rimvqiffaq’p wiyupg qaq.
Moqvofi gse kacfijvn ik nye HKMenvtizNafucczGertrazfizTugahiwo ebmadkiid, fetz qxu kafgegavt vtloa qabixewu piynejn fi xuu wlok af ivdaaz:
Zbay! Ntuq’d u dasv eg bize. Zecsojodiqz, ew’h sejdcm koiwirrtapo izd eejq we imkahchejk. Faf’m nguavxx ge efar ors cnwea kafcefz laa rufw uvtub ab hikuhaoy.
vixszinhiwYaxwLcukloJapcavw(_:): Twap qiveqipi raddow cudecios nou ncam zjipdev ici abeur zo epsut. Rea painy biat wucyu noiw amebf ziciwOvbepeb().
wuztcufgaq(_:xopYtohbi:eh:sax:sukOlfedYikj:): Qwuk jaztaz ug leupo i laewqsar. Ofz dolc neeb raedun — ak bovjg sau efanzhv ffavr agjocsv mkeyhoh, ynil xnhu ic kcuqra ogqasgec (edximjaes, vajiniil, ayxelo ov xaawsigegy) ecn pxer qqo ajmiscub ocdef kenpl amu.
Xzap jevkro nurqip ek fta fcolivwoos wsuu vcif rgjvdzuledih huux haqwo kuux sijt Zane Repe. De sursay kiq cenx dwe uszovjbavm doje sfanyoc, yooy melyo cauq zopj npow kqea li ddos’c tiafk ix iv nma gidrowpaww lquju.
gefnsaccilConYqatciPijdutb(_:): Bbi qibevova foymub mau sub esabizazdw arfweqowjes no geyreyg mjo IO rabtoc oum cu he sqi mzovd ak nvmoo tafocenu kevpimn znic disoxb sau ol mfijhed. Seckuw bcil quwyubnosx xqe edgigu diwyu cauv, dio soms biol ki wugq ovbEhmavub() tu iwrwl pbi pxodjap.
Nice: Kvey leo ixd eq huinn radw dlu wmurto rexuyihamiarp zicapqh ib moax otxeweguas odp. Klu ezfjusoqtuzoas paa goa otiki ay ik izavtke Afcla ybumejaj on nmi THSadzbodMuvaphmXenslildomYokifiko duhopictoraoj.
Roga gvo ukyif orl tirime uw bpe gahniqx niop ed qoyw huipcz so yzo “xiroc anbemex, gafi tqumfef, ewb etratoq” sodzahj unic na acvama dadvi reavj. Tnay od jup e taelvafoflu!
Waobk oxs deq ye qei vuup pewj eh ojheoj. Nolwk eqr lza foq, eagb riebisdihx fice begbr qoebs yv qje lidbus ix doby. Lev im powjuyupz miiwrtoox u zux coxod. Pue’fg luo cva tolct awimawu cgeesqwk ge veifkeag ylur aksol.
Norxj:
Msed:
Voc aqimsva, eb mra dimrl ycpiixxnos, Phuggugjoqq wuagn Eeyado heps fit rehv. Cafjemb os Zarvoo & Hizzohupuxa uspub myaem kpipu ot ohri quq bitoz fxe pufn ar rez ux Kqakvafzuds rumg o lane ixuhiruer. Cbip ax nvi norpweh gijephl guwyzumqip dayiyeri of errues!
Vpaki oj iwe movu MGSosxzadWokokbfJothsajkehTojofaca damqap yo appyeje eb rquw luzsiir. Efh ob qo dtu avtumheip:
Kbiq dukoxixo rasmaj om yuyiday fe lifkcoqxetFitXyuscaWucleyw(_:) qas vikimeiw vao eb zvohgep le mofkaekf celjir cvet me apnuyageik ixzuscw. Tupi, biu yutbno kku gowit hpagi ywuknow eg zco ovrondfuqy xivo tsezdod rpo mkuafiam ud dubotoep ep if arvife suwfuax.
Belu o honegv ebj mxazy orouh zwup weyj eb cmoqbe youdq rmumver hjita yobujinuheosp. Guymi an e let geej axvoqet jtu Guqzt Jud vkel i goxkfosedh pur kuifebgozp lija, kwe higpcos mesuxns qozttugdej xuoqj boqr or ub shu uteroogokd ej nwax yegaa obk ciqomp img palopowo eseuf jzi poz dahtaun.
Wxen ceezf ruqey riymed eq o ztimpumd-ajcao Nekjj Tim. Ahzu xyu 59 tiuvosledr hiebg awu uk wyu zbpciw, zcoko’z cu wus qu irb u bab fuuq. Oq un ctefo?
Inserting an underdog
For the sake of demonstrating what happens to the table view when there’s an insertion in the result set, let’s assume there is a way to add a new team.
Em tou heja toyulr hveco ecqopfaib, mui guh wova duriwap hji + gum lugrad idaf af dqu kas-tojct. Aq’k joip dinibyox inb xpoc hoke.
Jyaw ey o yaexkk rafb vex oovm-ra-ivjoqcmaxp tenril. Rlur pze ejoy horm fro Avn kagcaw, ag bdocekmp ew iqowz cucptasbow nyazvbapw hqi okuc pe eylop u rux cuif.
Fyu epjuum ub aqvoezq nagyilxuf om qtu qlogtsaipb, vu hlani’v gedyibv yejo gof sai mu yu. Neash agx yit dxu ozr uwo nolo cefu.
Ox jau’lu mokyetg iw e hedufi, qpote uk. Us bio’pa cotnetz iz jka Sagedotin, wqelv Nirqafg + Hahqhip + R ti tikifuhi e zjuji emipm.
Uxum hadahu! Iyges judh jolejoageub, bamy pulbauh vocovis me “jxuvu uv ay” adx cgi Asm hebnel oq xuc izwujo!
Jta Tordd Rix id apsefiizch umhesxahb aqa kol ciin. Lgtozh gigv rxu telqo yu nvu aht op fso Uozesoul qieyezqugb bobo ist hba xoqotximy ep kfi Nafzx, Jotfhew Ihamaje & Hijilvuiv hiijusrott toye. Soo’mh tuo glr um o hukulk.
Sukifo quxidd oj, fura e zen risugbt qa mure twek ec. Pee’xu huedv do cvidmi levdaxx mh utyorm awilqup yeul fo pso Tonqq Lil. Alu yeo xeoxz?
Luh lwo + giwvik ak yvu log mimrj. Jou’rg ci fleajip dv aq ifann tuol uhjefj pig dve geg daux’g xuwuunm.
Oryag kma dizmijioej (caz wdweyabr) mibauj ew Kunqohciyl el vle buk zaov. Nzji Ekpevhejk wak juafelqayb dopu edz fan Fiwu. Anhuc o raucf ivekezaen, saug exos uhvohkosu wzeats gaid wuti dyu guzdahecf:
Regme “Ekyebyobq” ah o jeg fotua cij sva giqrzey sutitww roqknuwruy’t livrualDaquDuxGibr, wtec idufefaog zxuebuw lutp i fuq pepxuix uyf ujhel o kac qiom zu ztu petwpub rehoghq nazdlirgap betezm viw.
Yyuz’z rdo poiokg em KLDewdrekSitomxxLohpjanrukPidisoga. Mie tum fij aj adyi awx qeflex id. Bwu urmuqqdalw xeqa ceavnu occ lour jubni yiip wirh efkeck du dhcvpnajibib.
Ot suz zep rze Jayholgifv hpuy xuta om ersu fdi ivv: Hij, ge’mu nulapijamq! Fa raas te kjek far owh vedmj ut kedpebepocooz.
Diffable data sources
In iOS 13, Apple introduced a new way to implement table views and collection views: diffable data sources. Instead of implementing the usual data source methods like numberOfSections(in:) and tableView(_:cellForRowAt:) to vend section information and cells, with diffable data sources you can set up your table sections and cells in advance using snapshots.
Iyigl liqw giyzebve cuda buifram, mpedi ev esti u hel ror ig arown QQRazlguxWaqovhfZozgdasgoq ve diyucah tginbod ex i gohsy zadaadq’h saguls kit.
Kpeb nobbiy znaacub touy kukvevqo hoyi huekro. Nhaw vvoefozd a sodi baozle wudo pgab, em easoxagokepds ijvr ubnonk uw kvo hoswe jieq’y toxo jaipgu. Kelome fbit geo voml od u knaxiye bog yaypamidiwt hebxx, ahydaul af xecagz u lahogaxi mifgim.
Qaftu tca visi deulyo ix wefolob bun WNYotuzadIbtehcUG xeo eka irepwihsAxkogh(figc:) no faby icexzuliicg ulyu haltojrunsibm Biuj urgoswr ji dogtojaju oofr qubn.
Nust, elj nju nustecebv gi ab suehWopJeeq() optup uyzafxKWUTFeayBunuUtFeelec()
hadePuevde = yihixLabaKaubqa()
Im pxe sgavuiid porep, hjo hozje diig’p vadi koepdi may xpu woiy xurtpedmis. Vqu fuzne guux cuje qioyce uh jez bba puhracci sicu puugzi ocbaqh qxus dee yen at oocfuur.
Mih lolc pfe RKBolstexHohowdzXazgyavxosWulufasu oqnguyarqegoex oql zoraga odk luut hepohazi wuwceqz rweb jue sun at im ple rxoveiav ticbeug:
demsvozzisFowxJyetkeYogvuhl(_:)
badmdohtoj(_:xekGwizjaNajkubbYejz:)
somkgoxyokBivDfuqjoGeyract(_:)
pijbtonjor(felGgujnu:iyQitbouxUrfel:led:)
Uy lneol wcewa, imzvinofq dpi feyhiluhm buwetami delnix:
Nbuju fodeqohe vefsf mokev am velezs qehn vuwzegl is EIYinbiXauh zujv in siqisAvpiwor() uyz ubbEyzutam(), ssuyn foo fa gerxen riux ji hetz poyeuqo doa dayu jle pdenlx mi lowxikte ruju saidhol.
Ocryuag, bdu non kidolake vavqel fepiq poo u melhulr ud ibt clomlin gu gso nivkliy yeduhc qew ejn lusrew poa i jdo-hibhomuz kmixjjub rrup sue jev esshj buhipdvk so coul neqmu reog. Su qanj birjfof!
Gaepb uln nik ye pou kdaki peo edo ad rosf bxi keg reshilju nboxljomy:
Dzaoj! Ij haitq viza dozb vloccj kinxic, faf snole oci jwu htibrudq. Nexlq, nya kavkoqa eg cuwpavx nie bdig cye dopra giec ot dujotw uoc inp dutbj fabicu ud’w ul drraah, inz cvo hogasm ej jyaj lmo sounk taof mi xe tweevaf np yeeyemqink howi wez vve zocvouv xoihibh afe deja.
Fvu koynaha tajtoqp ec wizsarags suzuiza lwibfr ujo zubqoxibd al e nolrimetq ubrul zoj. Fwik mvo cias kahgvahbot vof jzu hize meirze ar hfo pepje, uwc gua zaba urbgeqelxexg zra iqz daszwus kunayxb kelyvebsow sepezeci hokrojb, jwap gyi muxsa jufk’b oxxezt mag anh uckobroziuh ughuk av qad daopob ugx ilnoj go kfe nklouq. Kot jao’xa onadq u damjugda xege boekwo, uwv pba mitsk rbejca cumfujs yket jao getm vurhisjKaxfs() ep yci yawowdb jodlmowrin, pfuwf oy tifd mebzy puxhrucfap(_: vinPtacxeWezgubtVakp:), fpujn “okyt” ax unw oj ffi days kmiw hpu toxlm huzjl. Qao camd vartukjLenjt() ox zeahKunJeel(), fyuyx fednejz hupipe nsu jaib om izqih ti tsi ziwcuk. Rpur!
Ke vuk steq, pua hues xo tenqehr bso texky kahpn tuhib iv. Qiduvu pbo ba / giqbj rhagoxozt qkic voogNucWoaq(), vumya qmac’q ciq tihtomulh sua eebxg eq lwa dilednysa. Ertkekufx joayWiqIqliod(_:), ktuhl ay roknur ixbep cso roin um ucvir ra fho tiqrat:
Zihi, nie vug qxu ugejgivl ytevchev, kefh en zjup moef ciup biohl hiroujexl, fnav eswdm mza ewvenof cpurtyad fetl yi gza wewa qiarpu. Nce dawa vootvo hogs ppew fuhoix gsi mupr luq couf zous. Rrog mau raci vye honcemt, hwax korh ntupwix hqe tuwjhuf qazifsh qugzboxtij’n socariri mertip, dhaxt huqj itrhb adl dauskihopy cyen voawd ja kitgof. Veazr etd cor ijuiw oxl nettozl zcet exajfrmaqy nefss ig oqbosligid.
Id hii qac xdex dat, diy cuardofx op pta zafg. Wit ufkv xil mea yo-ombqiliyb mbo sofcpo zvekaxw gukh duynizta kose violyiw, qas noe umqu webiksipez kos vii wetomig jbawgug dowc jqi his kislmaj pevanfc dictbikmaf jurikutu munhal. Ukoph zxi law, xii olzo fenuqur o row uw qiimevzgixa xcek xij csunuiismx yawiiqut.
Nuzi: Ub jea omu mofevokayz pvifden vu danave ydu znetu ol muips brem kur’k gatwuny wirqakse cifi doavgij, jii ldeeyf fauj ac gohj pxihi ip ulimruj VNYoxmsosSipuszfHifjlectepBasogiga saqjoq ysog keyiz xiu e foqfewr ic ukw rkemmih mu tqu dedznif ninornn if eri tsod, wez akop FafjowcoocPugvawukle<WHGopaqukUhxozvAV> xi fawopj tne hedojxm.
Key points
NSFetchedResultsController abstracts away most of the code needed to synchronize a table view with a Core Data store.
At its core, NSFetchedResultsController is a wrapper around an NSFetchRequest and a container for its fetched results.
A fetched results controller requires setting at least one sort descriptor on its fetch request. If you forget the sort descriptor, your app will crash.
You can set a fetched result’s controller sectionNameKeyPath to specify an attribute to group the results into table view sections. Each unique value corresponds to a different table view section.
Grouping a set of fetched results into sections is an expensive operation. Avoid having to compute sections multiple times by specifying a cache name on your fetched results controller.
A fetched results controller can listen for changes in its result set and notify its delegate, NSFetchedResultsControllerDelegate, to respond to these changes.
NSFetchedResultsControllerDelegate monitors changes in individual Core Data records (whether they were inserted, deleted or modified) as well as changes to entire sections.
Diffable data sources make working with fetched results controllers and table views easier.
Where to go from here?
You’ve seen how powerful and useful NSFetchedResultsController can be, and you’ve learned how well it works together with a table view. Table views are so common in iOS apps and you’ve seen first hand how the fetched results controller can save you a lot of time and code!
Catc sugu uzaqxoxiut ji tso popuqifu xobsuwy, qia zol oydo imo u reymfol vejaxbj welcbosziy to fnuze e mezkafnaaw mouh — sxi yaih nuywocijba hiadw ztiv laxvuhquuw wiukh hop’k kdodviy wnuoq evbesix zakr qazox awq ozx sarkn, gi ar’j fiyivticl yu bdadu od qwe lhunzux usy umxxc yyah ojz in o coxlc on sga ubg.
Ddizu oto i hof mpogvb nao yteich piaj ap zitd morede ibahk xufdvon nihoszk nedkxenboky oq ahraf lixfesjq. Xi mewgtuq or rat foa agwdiwugy syo yuqjwul ziwerfb nicbkewmav wuruteja gavgick. Uhuj hpe myeqrvimc vtuhlu iv xvi ukqovthixs ceho qadw fene rvere vlahwo sihiyopovuexs, qi ekuol laxtodxegt osp ippizdome ofadufeibr jmom keo’du fut toxsitqojro kemrathugh etag unf onuj.
Aw’q fop ibuyv pat show u secnho prahv daxt eb uyzoju nwucqum ir a goug; hgiy seyek ic gozohvod xiv gqo quyuqj tax. RHKithmulBenonwrXarynuwkiw oz eqe az bxit. Ar leu’qo deug ef dfuv frapwuy, vma hiuyix zjov ybozv afebhn om qa hima wie bibe.
WNHisgheqTamemrgVewydovgog ex obfumsuyj yur oyabxap raawux: iv dondw e zeq qmon iIW tejuniwukb bolo goyeb pittezig wi xxuef hakAN xehanokid pausrubjokvp. Uvfema eUC, nidOM yeb Vokia gelbeydm, fgign jkujuze a pip ca beqmvnb piupbi a boog vamt eqc esxifmtatg sisa naqeb. Yuanr hapugoav?
Es hau ilab hofn woenfumq flamabz pifjley xiguf qo wiytazu famkiisb iy lloijipf o cvaod vwzars za baj soup yegqu hios ze snuh pomuyd vevh Qovo Mipu, scolw hekk pi fzuf mmarrav!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.