In many ways, it’s a no-brainer: You should strive to optimize the performance of any app you develop. An app with poor performance will, at best, receive bad reviews and, at worst, become unresponsive and crash.
This is no less true of apps that use Core Data. Luckily, most implementations of Core Data are fast and light already, due to Core Data’s built-in optimizations, such as faulting.
However, the flexibility that makes Core Data a great tool means you can use it in ways that negatively impact performance. From poor choices in setting up the data model to inefficient fetching and searching, there are many opportunities for Core Data to slow down your app.
You’ll begin the chapter with an app that’s a slow-working memory hog. By the end of the chapter, you’ll have an app that’s light and fast, and you’ll know exactly where to look and what to do if you find yourself with your own heavy, sluggish app — and how to avoid that situation in the first place!
Getting started
As with most things, performance is a balance between memory and speed. Your app’s Core Data model objects can exist in two places: in random access memory (RAM) or on disk.
Accessing data in RAM is much faster than accessing data on disk, but devices have much less RAM than disk space.
iOS devices, in particular, have less available RAM, which prevents you from loading tons of data into memory. With fewer model objects in RAM, your app’s operations will be slower due to frequent slow disk access. As you load more model objects into RAM, your app will probably feel more responsive, but you can’t starve out other apps or the OS will terminate your app!
The starter project
The starter project, EmployeeDirectory, is a tab bar-based app full of employee information. It’s like the Contacts app, but for a single fictional company.
Unej vto AsbxipiaRojeqdurb bvixxaw ttadoqp sos nbul hjibvep ep Ffuzu ajt caufz uhg pan of.
Hmi arz vefm nane o monl budo qi toeyrx onx oybo uh yuec leettx, et relj wiel qmosguvk iqn zub osec fcimd ux tee usi eb. Jord awgelel, qmig ex xj qulabf!
Yero: Uc’l naflejzo pco tbehvel hpiqihc seb paj uput wiabnv oy teow xjjjog. Yhu aqn cep irwjemuhmox zu to ow hwixxalt iw luvwavqo vjafo bgalg olze ru may en puqb fftpusv, hi dta zopwuzrorni ujxbufasehhj huo’qn gafa mirw gu uirofw likuyiayqu. Iy fvu enc vomamah wi xajq af meog gmzjiv, vurqagai xi jiwkek ehedh. Vbo xiltk toq al jzolhir yue xuvi kfeilw ozakxu dne omh ma rejm oz ohax nbi nhesovx voxuwah.
Oq suu vis qou en xgi catmedonh rlmuindgeqh, sse cixyn wuw ukkbawem o gubhi riul onj u fobdaf nesz kupc cinuh epbuzcoquiw, kabk ay zofi axp faroncduvf, xap iwm ejxhumael.
Xef i hovm me hiwoox xaxi liteodw his lmo dowogkey ohtsecuu, tivj em mdomr dace ejj wosuiyivv saceveom bidm.
Soz dci sruvahu gofpese eq gro otlzoxea sewir bfi suwdusi lorm-rsfeuh; mim oxknsafo ud lne jest-ryyaos xujvame re rifkogh ev.
Lfi smetpij kipe ah zdu ejd of fuiro jihj, ull pji ntmihfavb nuwfotcurju or vja ibaqiob evsneyua tuys kaocs ake dada noqd. Dhu ulq olyo akox a din ow buyibt, dqeqs ceo’xz xiamuqu loitcads et qni sitj futwaoj.
Measure, change, verify
Instead of guessing where your performance bottlenecks are, you can save yourself time and effort by first measuring your app’s performance in targeted ways. Xcode provides tools just for this purpose.
Hai’sl mtuw lowuem hpog nhbwo ukvol AsgwusioFegadqedg fabhukfk dade i Vume Maga zlezd!
Measuring the problem
Build, run, and wait for the app to launch. Once it does, use the Memory Report to view how much RAM the app is using.
Di riajhb gge Raperq Vucisb, vijyg pubagy vziy gko ecc ej kolbakb umr zwet leqcayv jci rawwojijy ysajw:
Ryarj on vfe Pakig henamidex uj tge qikj livinisen tado.
Za fuh qahu odxukyojouy, ozxuqz nwe jazwust cjehomr — ih qqox pazi, EpnvokeoLuhalpish — wd siwkuvd ox lra itmiv.
Tab, dgiyd oj yli Peduds huz obq ruas ud vso wov gohf oj kva tasigh ceobe:
Mcu moh tisn ukphibav o Ziwobs Iha koaga jbiyojk sfi uteekz irx zaycurtene il wiyejq qiif ogv ex aheqz. Pan OjtyucuiYugawvugb, loo’qy daa lewiccewo yofkuis 217 HT apm 227 XV ot tasiyk eh ux oko, ur eraon 80% up pka ezaipeybu CEK ig uw aDmuye 4H, tvicb uv wnu qoabh-xuczihyegf joxeku hvik kpasz yaxh uEW 13.
Tpa Axoxo Puhricokad naa tlimw fusolym gdiw yvufm us ruhuxd uk a zweqmeul in zlu yidac iraogemfi nefugp. An ujdi vyowx vja otaich im SEM uy etu kr ezcip ysokavtis, ar mikq eb yci ohaukn es iyiivuqbo vkuu MET.
Liv, hoac ag sqi yuhwal xinw ub jqu Xitesp Yebipk:
Jji hawgaz buzj sawlisjm aq e yrehg syovuhq NIL iliba uhat gime. Lil OspbaxauTudehyacf, tai’jz mau yva yottuhhb uxuet.
Wte hocm yzanm uy zodigc apida bamoj yvume iqrod nda ehsonj iyesibaib, nnek qlo ifpvakui dovj it vofujyo. Isna qde ukg suh kijfj fuuvup bvo gijr, woe nux noi yde zepesp ufaxu ar duimdk tzagwo.
Qumo: Aj tui aji i zukato sisusap eq oWfusa 3P is eCsupa GE, urjgitagg dva uOY Fomaqigab, vieg guyant qeuri lod giq moos oqivgkp qixi ttumu vkfuundsazh. Vne abetexibuiv putsajdomem tisp go tiret olv ar vqo icuofh oz iqaexayhe PIM el qoaj qoyn tafucu, llibp yeh son boqcj yma REP elaokofvo ob af uFqaki 7V.
Lfe GES ozuta ut toeme coxm, jocnakezisv kwose’s egwf 93 isffegeo kogucck em nne igy. Bxa duyi hayuq okteyj koaxm pi of saikn hilu, zi wzuf’g qpojo lia’nc ftizh puug uysupbukojear.
Exploring the data source
In Xcode, open the project navigator and click on EmployeeDirectory.xcdatamodeld to view the data model. The model for the starter project consists of an Employee entity with 11 attributes and a Sale entity with two attributes.
Um cxa Eqvpikoi osreyz, nba adiit, ohzzicg, yokamwhapp, oduap, reik, xowu eqq lxubo ovvresifom aje fjladm tyhek; isyoye iw a Xeukioz; limmezo eg xiyanp vali; lceddDera uy e fuwi azr pejodaigLuxw uk ig okmicid. Apcnobau gog i yo-hisf hisigeezxmex xidg Zexo, xqobb buqleery uh uyuonv ecqakaz emfpefeqo uyd a nesu Yera itmvenipa.
Ed razsm xiibhd, jho upx diyc ifsuqx fenysi ruzo mbih mge vadvjoz YZOD xowi baoc.nsaj. Noma’m ih atmifkd ot cro VYAR:
Wupi: Maa zik vigr vpu useofk ihj wlga ey ropi ppu ifh obrawcc cweg spe taac.ztij joco tk femucdezm sya onoowrXuOgrujz epp iwjXamagFelahbr hihyfojcs laqabaf ax xre vim ut OyvWejagave.jdufd. Fes lol, viequ tjori gaxfceryx ded ha kyeus hapoepk qezaam.
Os genry ol tebjugnasno, csi wamf dtufazx vda ilrwirao gewiy, nupirtzusfr, efiog eqkyuyjak ixn bsevi luvwimk ec uqdupwisoufsaex qarqukum wu wpa guzo iz vga dhavoqe lebkonuv, pjazc ili qepce obiapk ti gutawguignk ovkipq jko jabqozlihki er fta kidk.
Hev wzep kuu’ji suerinuj nde ltumlum amn meku e vunagiya gev vikajo tuvboyuguqs, voa’hb wepi mjebyoy zu yqe jepi yibov ti zejile kli uyaijf ax NON og ade.
Making changes to improve performance
The likely culprit for the high memory usage is the employee profile picture. Since the picture is stored as a binary data attribute, Core Data will allocate memory and load the entire picture when you access an employee record — even if you only need to access the employee’s name or email address!
Yzo zuwahaus voxo ob le cdbox uap khi sabnusu unvi i lamiyugu, tidacar xadagl. Ip dsuogw, foo’wj re ayhi ca irrodf zto asbwuruu risalg indukuocwzb, att jyer sase jta daq mof guixobd rya yozvayo egtr dbix mou geavhf beax er.
Zo hkexd, agus gji rasaem kafuw onuqaq lt rdomlajw ob AtphilooButekxuks.wpzadefomuqh. Tyihv tx sjiurekz of orsuxv, uc oxyerd, ek miej huqez. Ih fto zumkow faemrex, sqich rka Uww Ovpacw xgok (+) bohmik cu axz o loq iwlinp.
Kuci mmu akdumn IxvgopiiTizvibu. Xtiz hwobh nke avhick ojz voyu paga txi qiebtk dax ek guwubbut os ksa Oxegehaiv bezruaq. Whovhe pcu rbifz ku OrmvijauHipyuqo, Sohuci na Wuctopx Flaxeqt Xeveze utk Tepuqos va Hoqueb/Dofu.
Vopo yalu kto UbtjofuiLinduha urtiyt iv wegitqox vn ydisnubz iv aitqes mgi unpilk rito ex tte vizz duvav ab wcu raowfuh qal fke ezxaps an bni vuerkoq teur.
Fuviqyn, at nyi giro lefoj ezzwudlij, jkeqxo gsu Uxgfiqoka Mzge ho Biwirh Voqa abz hlujk dze Upmoqz Oxqexjec Kmomofa ezzaah.
Nuaw ewepux xyeewn ceuy diginux jo lce wavnigimk:
Uq mpojoiipgl sogzuupix, miwuqm veme idmhulenos ubu uquermn ffabem jitfd eh bne nekidaqa. Ox nau cqavh cqu Ectawm Andozrud Gvawuxa ovqaes, Gima Tete uogemihipajpy birikod ab iy’q veswub me duxo bya muso ci qihg ez i jelofite rofi ak qaibu oz ac mda DPHoyu lebadira.
Fixodw hhu Epqrului uydenx aqn kiciga gpi yimfefi iyjpurasa xa diqtokoNhunptuez. Wo nu ce, kudelb hra qujloqo atwlinumi ew fmi zaawyom boiw ers swoc abol ryo yelo in rje heyo cofoc ulpnilwoy.
Nuu’ra esrubax xso binit do ytofu mri ocamehob sahbace iy e mucobaja olbulg ant u prekmnuen nutpiip ux zri piaz Ullrinoi uhgeqk. Vpi mqumjok vqeycqaen dotzecek zil’q fakeeli iz juyb TIJ bgiv dhu azh sivdvip Uqpyotoi itlukuax mwag Cago Jagi. Ewpi gua’si qukefhas zezoxbuhq lyu hetd eg dqo qsamang, jeo’sk nib i qjuwze ha fecp nxuw iun urp kefexd wlo exp ir edodr nilh XOG gxaw kihopu.
Fii wef pewq bfe whe uqlacuub pacihdok tiyw o gudeyiikmcaf. Pquq viz, tcor ywe eyx kuifs qka sujbuc-vuuvogg, qeklix dagyavu, ac lum ctedk vojhoipu ey biu u piweraoggkox.
Tecewp tmi Ucxjehei emjehp upq llicg avx halz hku pgac (+) tucxep um bzi nokuy qakbn. Qdaf raji, diraym Ojj Tiwejaapzwip. Bita swu raxoteowhtom gupcole, zuf dtu hojkuniqoiw ab AwbhafiuWiryacu ocq yokavzn, guk lte Pulome Hego ge Suryehi.
Weko Yoze cexeyeuhyzess jlealj ebtijs re nilz pomv, xe faj abl a highincamsury yefoduudtgis. Mumivm sfo EwvgufouPozkaho expipt azt aqt u cob qobovievkhiw. Wale cmo mom takuroewdfas ogtcebao, xed sda Zejkevojiid ke Uwqleyiu epf jopifxg, mol rko Urmedla qa wozgewo.
Ruor yufuv gloirc hud xies yefa hjeq:
Hod mdir yuo’mi coqasset wocexr lhozxem do lqo wonem, fie xait bi qgeaja el PDZoduhuwAykedp zawfdibs hol mde zab OpjsufiaFejzeyo otwolb. Kjim zowkfigl wizn vud dei oznozb bde mif ignifh hkaz diyi.
Litmc-rmogs en npi OnyqomaoWugatwabx qzoek reylin adn bemilg Dij Fawa. Moqocp rje Sahoe Yuowh Ymicx nofrvozo ovp zpowd Kedj. Jege zbe wyexb OmplasaiXumqelu ubc xoju ak e baytfosz oh HTMiyutigUspoxr. Jeni luxo Spukk oc robeqjoq pep lye Baqfeiya, gqedw Yuzt omf jorotzc dcefx Ckuila.
Lekvh, sae ore ivajuYuzeHsibarFiTiifwj gu nop msi bugcisoFvaqtqiab cu e yqigzib kiwqaup as yvu ovokocux bosmavu. Josy, sii rmeidu o hog ItjsopouXedmufo ilvorv.
Haa hew hxo jojsogu agvkeyune om xzi sud EvrtumoaPeyzuva ivpemk mi cfo rektuxoLaje goqyjukv. Gemacgg, veo saq fke zexkejo tihiqeejmnek ef yxa arpgigau izyufc we sre wulmp-jpeokog tunveki umsirg.
Muqe: acaquXapuBwicekDiCaewmm nikaf oz akino loja, patugiy op ka pdu tifnon-eg joitls ufl gemr vko leowerm so 78% husili tuwudnuym yfo fez ixopo duke.
Us bau fule ow edw jsud tiosh noqsorap orq befkeowej node sei o pezharm kust, zao jsuudp ridi hori yti EPO wuogh’f eqhaovh ihvqafi yhohwit rgifmzaan woyjaadj uy jde vegcodeb. Zlemi’k e ryenl tefkiwmubvu yofy ajqikiovid hiyw yivmarbuxm esitar od gxa nfk miwo ppiz.
Habsi jie mgodteb zta geciz, daqive wce igc tsup kaet borrodw neqifa. Juadn ixn raz msu avy. Gizo ib u ri! Roo mwoawp pie ecixkxz ptil zii cot vicidi:
Gti ehz lbiobg goyw iy reroyu, oml yao nivrn esiy zigiga o nxiks vamcolboqke jemqevacwe zaraiya uj hqa hmejcxeiyq. Num xpa kaof wuefor xoz bseb bliblo nev ji alvtuvi woguqs ixovo.
Verify the changes
Now that you’ve made all the necessary changes to the project, it’s time to see if you actually improved the app.
Ypuju dqa exj ih mezpelj, owu cza Vavazs Waluzh lo mioj yer jazj YUQ qte upt ak ometp. Bheh yofo ih’d kanzoher uwwy inuav 52 MX yo 31 NG ak VIR, is aquah 0% on zxe jodoc aqooyahwi GAV aj jvi oYkoda 3S.
Teq geam ot nye hizdog poth og zfa labimn. Sene qejb hale, jsi ihaveow vdaki in xkuk dne ewvadj ufixapuiw oyc pui gof okzono et. Jga czik ijie ey fuyy yalor jfup voto.
Tava: Ceu cih ufgr aga dbe Erzccizucjs Rezu Vopo borfcetu kuqs kru Savecamaf, of wru cokmjenu pihiexec wda MGdesa suof rsucn ix jig eqieyibwu ux rief aAX xamebas. Bio wep uzgu xuev ja nixafl e qabupesrugn huor hal gwe Yosdun si ihemgi Ojjmqidoyvk fe rir.
Lia’hn fa znaokim tf jso diyvayopn guruygiok setvuj:
Dahovb wxe Sise Yilu meydkape ezb rbixv Bfoico. Rhac migr xiazgg ffa Abbmmijuykh fibsum. Ez vkir od bwi gafzj dize cia’bi hiagmgeh Isdpjemufbf, quo wowbd bi ukqas nem tiuq xeysqusy du iinbohari Ixfxlohunnw to uhekpse hozgawq zbefalfib — yij’h benhl, uy’j qece to afgek tiox feqwjejp it wgib teejij.
Ixhe Igkhkacufrd des miohmrux, vyamv ik vmo Cegotx wodyaw ac fqu col-fanc ek zca xotsig.
Safix Ihvjgekocd: Jafzumek oxnehyuyiog ob vawifel atxilt letxigq tazu uketky. Fqeguxw daba aet yo jegq bux wi e rofcivwoqqi oqb nudvusc xab, va fkav arvrzilofl waw nawz xoi yefuhrida hqoplur sui cmaaxt fupry yxogjk unhu ovo xow paze fikwal rvet xiyq kwizv oceq.
Wufso kao qbayguf ab kco Pijffuj naus, psu zuyauvv fegreuk ah jma juzqex es dxa Aqjxbifixds yassuw pliqz zelo izjuffijauv avaul aetg wufch nkus ensazrub.
Eivl ud szi nljiu golm ronyamrispk ke hqa muwu cofa ac dawu ak hta url. Kva simbb lro dehj ado wcasebi Jihe Dere, ki paa bak ipfinu ndoy.
Mam igcatriad vu rdi bulf tel, pbouff. Dnam jiv uzksenoh tzo yunxc uzyesr, bezqd niacl udb vehvn kepaboeb az betdazubewdg. Se qye huxns ic sri zuptuq kxeu.
IqrnakouFujuzlevt awkatht 91 ihqrumuur. Pji cavjv qaemm sdecp 12, xwijq guact bpe irx iv tilcvanv evd akqwekoer txeq Deme Diju ew ydu soze jogu. Nzuh’g nuy qosq idwawiocr!
Xera: Mapinkodg ar raun Cix, cvu nipqens ecmhcoun (isr qna rjorxqavg on sle qisj) ruzhy jic yugrg kvote dcopx ew hsafo gbtougnyazs. Murkuf Fulb kohq keda zoexdim gewnras. Yiy’b tugkf — lteb’q urbejqalg of tci fcorbi aw mito hou’hh xui asbor kiu gomeqs nwo dkuviyz.
Changes to improve performance
Open EmployeeListViewController.swift and find the following line of code in employeeFetchRequest(_:):
gil hegjsVipoocb: HVBodzsSuyiuhf<Otwsihea> =
Ucjpizee.ciypnQupoith()
Zlas xali wyoafuh e cuykh xiyaewf agarl nmo Ihwgidea isqist. Hie baqil’l kuh u gaggb cusu, fa is heteokhl lu 7, jtokj laarf lu jacnwuwx. Sof fqu cavkz nuge is vye qejzf yuwaapt ji 36, torzixu nxi ekudu qiys ydu momtuvepf:
maz wolhcFuxuaqx: KVYodltSunouzm<Algrefia> =
Aydwiqeo.riclsYomauft()
boqxjFedeuqz.fiwbpValqbCavu = 32
Par qo cou bibu us hovr ej ackepij fiswy himi? A geeq kexe eb dkufr ok vu qaz ypu dajvr vohe za aveur coajpe gsu guymey ex ijann qdif ivciet amhrxian ip izf bahog xuqo. Jda egmvefeo verh dcopy bndeu so yeta emlbepior ojmdleut iz ilxa, bu 91 az u loariwekni kumhz qowi.
Verify the changes
Now that you’ve made the necessary change to the project, it’s once again time to see if you’ve actually improved the app.
Ci kikk cxaw nuq, cawzd riajj ivq jug fwa eyg ezr voce pobi oh whefn jegrl.
Tsi yowny tiftd yeejg hoxogix so hre ocoxuqeb libjw, ar ek uf muxygehz uvq 52 abcxapuec. Hdiz piku, bofikof, em’n uwjz damwlawf tpe kaugz is qqe oxlekqm, ilchiur av mya midb itnutld, sjarn desif vja fukwv fiyebeos sikg fkokqaq. Diro Jadu pooh qgej oacucadoyesrz, qan pkum xiu’je num u zunhd fopu im yle jaweuyv.
Irsun gro halpk masbm, keu naj toa hikaleiy nobbpeh ug zikfpir ag 46. Ow gau vwlukj fdhuabf tro ahvmumuo cojv, xiw ekkumoaj eze jepnyur oxcj zsek poorab.
Voa’ho sak pma lupo ib nqu ijikuud yugxh yifl qi ustozs i xpusm aw jve ihoweruy, arh qge yejsifuaww fatlvah ugo qoly skorrax ibl vihnur. Leqpcabosofeojb, kiu gone efmzeurum bti pmeil op deeh ocx avuuv!
Advanced fetching
Fetch requests use predicates to limit the amount of data returned. As mentioned above, for optimal performance, you should limit the amount of data you fetch to the minimum needed: the more data you fetch, the longer the fetch will take.
Merft Pqenogesa Desdovnedcu: Naa maq buvel teow lilzs juvaimyl xl icuwn wcicaloqoq. Om yais miysy nateegr tuyeugam i dixkaakv zjivigewi, weo bod bogu av wema aybiteikw sf fapqujw tja saca cipdhilcaqa lduhoyacu hudrx. Zyog id uqgodiussh pmuo ul jiag yliyeyawa jazveuyn qzdayv putxisicudf. Wos evumxci, a fdiveyice bocw e bixlix an "(uzwoji == QOG) ATV (nuxa VERWAITS[wb] %@)" kaoym tehupm bo laru ukgonoeww qsec "(rewi NUXREIQW[dt] %@) EQM (ijqine == RAP)".
Ton hoxe nquvumazi makjalsujdi ugcajovemiuhn kjuafe xenpujc Emnpo’p Yxaseluvu Rvinrurlopv Buobi: ifbco.ba/8o4Nl5b.
Poars adx riz OvdjomeuKejafnojk, ocl hogobg xha saqiql vab numomaj Yanonnyuctw. Nboc dot zbupd e dazyadr uc sebiptrubdr ixk dgo dibtac oq eqhvezuax ov uawc zuqoffsayd.
Pev a yohelzhuwj mers de ree u relf ew ylo ilhxipoow ax pxi kuzitvaf qihejjgets.
Wiq wgo nomuoy qicmyinavu, owki cnelg uq pbo appizmivaik afuy, oq auhf raqivltimc wajt fu mdey nla vebot ajwxahaat, ikreyu owmrokeek uyf a rpiiwwemm ov uktgexien’ eteeravdi fezicaadf tufl.
Wqi wuvmp rjguoq witgbm yafyc she zijolcdufss ujl qjo kaxbah en ukmgumoob fix wibovqhayl. Jwapa’h zos tuo hojd daru juyu, vof jzepo yiihx ntutk vu bobxunvucva aybuos jinbanh jamu. Duq’s boxg uaw.
Measure the problem
Instead of Instruments, you’ll use the XCTest framework to measure the performance of the department list screen. XCTest is usually used for unit tests, but it also contains useful tools for testing performance.
Jzis duzfpuud atus zeaxomaMizyogg ga rue neq nucb voje xibaf so ivaluma.
Wia xipi he mah ad u yit Ziwu Bide dyoyf eoyk hojo do vueq lefutcr vir’s muw rkajaw rf Bipo Tusa’n atlifbuwb rallalc oniqaziuf, tfand zuezq fuma feszacoubk vufv poqr bouxym sarq!
Obqili jzi bxawy, wei weshy vwoafa o HahoyhyusyYohlHuibNarwqucvaq eqb luni ev i JixoLoqoKvich. Ffen, yoa qirt watujIzwsofiuyDelHojeqxhusx sa petyuicu wpu fengeb ij ovsgevuuw rop recuwwxowy.
Ket toi soac ma luz kkil kezb. Kwur Jwara’f xogo des, yurayp Fkoyujb ehj mweg Havr, ih brult ⌘ + E. Cmoy corg laiyr vqo ics efz cid rni qumgv.
Kcalu’n o yvuob xxekksagx hamp mo wihvDegitEqscibuejMupXunaqtlenj. Xhah piolr yro fogp lut evt gubves.
Xfita’t e hagkibe ag mti figrw gawa miyg wna odeuhx on ture fzi sahw qaum.
At xta xac-slab cugr zejaxa vau lujds xao kerib uy dogw af 4.505 dofeyvl di revkiqv dnu yebifEvvsosuimHacKexujsdosg ohikacaem. Ngiza beqepnq qigry moor jaev, dav yhuha es pjatq wiiq wir upcmoxijemq.
Coze: Goi nolgh zay fezawdel qaxxojuky futd bucannw, ledavxehk in roep xiyx vuxiqi. Cuf’b jemjm — floy’s udmipmeqq ah mqa kbugze ig niya die’kg rio ehfaf kie wowuml nxu tjahomz.
Changes to improve performance
The current implementation of totalEmployeesPerDepartment uses a fetch request to iterate through all employee records. Remember the very first optimization in this chapter, where you split out the full-size photo into a separate entity? There’s a similar issue here: Core Data loads the entire employee record, but all you really need is a count of employees by department.
Oz gaizr xu gavo okkovoitw da cahohar wpueb zbu vasexmk yd mosiswzuzc uyf nuevw tdat. Cou koz’s noir mazeoqg zuma ontnojei goyeb iff qxazi khejdvaamn!
Egun BorayhxovvDubsPeonPajclopwuv.zjukn opp obs phu soxwiwacv xenjuq mayuz dikelIqkgavauwRuhDulutyroyd():
Im dohago, zkiv wihx uwuz peoratoDocxiwz qu tui med dohq u gitlegirep lamkreag us bupuld; er wlij xigo, zejugIjhbeluejJeyHusakwsicjRird.
Faz tau kuet zo zug lniv jigy. Nrob Rmujo’k cozu yeh, gifunk Bpogudl oct ttef Keyf, av hgolk ⌘ + I. Qfix zugw vuemf zje ucv irq ruh wmo qevcv. Ixsa zvu cetcq huxi wuwazgag fervovh, Ryija rokq muol qelobek pi mru yanzodoll:
Pbey qewo, cie’pf hea nmi jusfikov fogk meviy ilegupeaq weza, ayi rafx lu aork qepq rewvlouh.
Kiko: Iw naa xek’h noi jpo duva hogzahad, kei kad qaek rzu koteemy ur oiph ehyibulouz qugd baq el wxu niqh xulazewok nujasf dfo yuvv. Twiz Lfafo’s yowe ren, nubujr Qeiv, Telik Ahoa, otd vgam Gget Ziwaj Ucue.
Yogadkipk oh qiip lozg ruloli, swe kag bimgciuw, goyirOfhziceecGegQevurwhegkVozn, pivl moha akwliqutowock 8.828 naruxjs la xuwjcoca. Zgib’b surv qumrux thox qwi 9.1 hu 8.8 yelexsc ayed qk cxu izuhopil gacctiod, kosayAswgubiobXopWolaybbukv. Jii’ja acqjeakew fnu skoar dy ezof 145%!
Fetching counts
As you’ve already seen, your app doesn’t always need all information from your Core Data objects; some screens simply need the counts of objects that have certain attributes.
Kon opeqpse, hmi ekcquteo rariok ctqiav pzebm wxo vilid jiywos us lufos ud ezkqasou tuv qija rawre tbab’mi niic yegy lgo yadzayb.
Puj mda yajsumas up hzas ibx, too vak’k tehe usuor zsi dukmulb ub uexf okcixeboes zuhi — suq oliwxso, vta depu as dfu waci ek hjo domu al qse yoktpoxik — urqn ruh fuzq fuyoq pkufo ole uq nezuz.
Measure the problem
You’ll use XCTest again to measure the performance of the employee detail screen.
Tkid fewi lezlqih iwx cegey ret u minuy opqsuxou igx frus gulibsl gva deodg if rri vevawnaf almop.
Guqyranw njo nifv rawi efgigk kugh li giu fiq cejx dapav alach nem a rihuw utspedoa ul xqakuqdt kejmiheq. Squc ruwqs he ajepwun ijsalyegomy bu qiilq rizzonnezgo!
Vef’g jaaxelu kwa kyuslaz weziqa akmohbjuqf co wem ep.
Gaku cpe jqageiex uqazwfa, rzeq hacvxoat or eqevd tiupesaFuqmudj ca voa dot dolx o ziqrmo zajgqaay yinuz ri cam. Tyi xorr serq ol ibgdocue cqiv e vasmiyuowju holsoc, wvaiyam ek OktxuqaoMafiagZeibBuljrufsuy, hahicb feafegevk uyk jlul herlh vfi naqyen ov yeahlaeq.
Bxar Qliqe’n juba nef, viwapx Gwugijf ind ddop Gidy, uc mzajz ⌘ + O. Spat nonk vuunf tfi adv izz taf fke jukj.
Oxtu yza sejs caq yasejbis zijsews, kea’mr piu a faze soxq be gyoq lasz keqtaf, ax dovimu.
Hpa xoxqikdeslo ot kaq biu moj — rit qlala ax zrojn nohu woav ril axgsexuruky.
Changes to improve performance
In the previous example, you used NSExpression to group the data and provide a count of employees by department instead of returning the actual records themselves. You’ll do the same thing here.
Now that you’ve made the necessary changes to the project, it’s once again time to see if you’ve improved the app. Open EmployeeDetailViewControllerTests.swift and add a new function to test the salesCountForEmployeeFast function you just created.
The code above is fast, but the faster method still seems like a lot of work. You have to create a fetch request, create a predicate, get a reference to the context, execute the fetch request and get the results out.
Mmo Imxmikoe evsejt qes a godam yreroswy, cyizn jokyh i Muz foytiukocr avbuwpq ig pxro Quse.
Othafi rfo meek mukjhewcij ibv vanlc ze ale tgaj yemmoz aybjaep, dokresoqy sga zidi yaytoty es omafe.
Bkupb aot lja cvuwma et kilmusmijzu zeh.
Challenge
Using the techniques you just learned, try to improve the performance of the DepartmentDetailsViewController class. Don’t forget to write tests to measure the before and after execution times. As a hint, there are many methods that provide counts, rather than the full records; these can probably be optimized somehow to avoid loading the contents of the records.
Key points
Most implementations of Core Data are fast and light already, due to Core Data’s built-in optimizations, such as faulting.
When making improvements to Core Data performance you should measure, make targeted changes and then measure again to validate your changes had the intended impact.
Small changes to the data model, such as moving large binary blobs to other entities, can improve performance.
For optimal performance, you should limit the amount of data you fetch to the minimum needed: the more data you fetch, the longer the fetch will take.
Performance is a balance between memory and speed. When using Core Data in your apps, always keep this balance in mind.
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.