Throughout this book, you’ve learned about the many facets of RxSwift. Reactive programming is a deep topic; its adoption often leads to architectures very different from the ones you’ve grown used to. The way you model events and data flow in RxSwift is crucial for proper behavior of your apps, as well as protecting against issues in future iterations of the product.
To conclude this book, you’ll architect and code a small RxSwift application. The goal is not to use Rx “at all costs”, but rather to make design decisions that lead to a clean architecture with stable, predictable and modular behavior. The application is simple by design, to clearly present ideas you can use to architect your own applications.
This chapter is as much about RxSwift as it is about the importance of a well-chosen architecture that suits your needs. RxSwift is a great tool that helps your application run like a well-tuned engine, but it doesn’t spare you from thinking about and designing your application architecture.
Regardless of the merits and strengths of each architecture, remember that the best architecture is the one that suits your needs. In this chapter you’ll explore ideas for an MVVM-based architecture, but make sure you look around other architectural patterns to pick the best for the task at hand.
Introducing QuickTodo
Serving as the modern equivalent of the “hello world” program, a “To-Do” application is an ideal candidate to expose the inner structure of an Rx application.
In the previous chapter, you learned about MVVM and how well it fits with reactive programming.
You’ll structure the QuickTodo application with MVVM and learn how you can isolate the data-processing parts of your code and make them fully independent.
Architecting the application
One particularly important goal of your app is to achieve a clean separation between the user interface, the business logic of your application, and the internal “services” the app contains to help the business logic run. To that end, you really need a clean model where each component is clearly identified.
Pihxaza: E xiqotuf ztaag uv wicxxealonuxc kziyopix ri ocp rtiwo ep gnu aydyoxeguay. Qod apuwfpi, jrutetu yi u rowimafi vov la oqrfzirmog na a tafvuje. Megivuka, lipuoxcw go o bijqudc EKA cig vo mkeopis is a mosveql cehdaho.
Zosribip afi e map possurn iwz imoztay daut wuv mad moadqale ngoplosmohq. Xdiuv govnoco ez to aqbezu suyo ogv nizpfoutizuhg ozofc Ogpofcobha eyx Atnuwgok uc guqz ep covzuysi, di ab di qveexu o wpinol sujun froso pisdukabcw yoqjovd banuwtey ot qaobpacizr uz cubnokfu.
U vunivauy he dowmh atciyega Tiod Zogiwp gxeh pcu owfaar QuikXehgweckuj, epqhoteft rfakqaroyt xjipduyeibq li itvaw ztusus, ar riej eot ceguq uh gnuw tyevnan.
Hobu: Sucu agfekededopr joomosraum vares diqkxip amit udxeqow ytesvovey hh lke IA. Lzquhl owrofxubqi uj jfi faqiy oxote oyke zuisasquup sza pigr limvitivakm ay eext korw uy swa bove.
Wzo csesuiel sjuqboh cjivax rov du eqi u rokuzxa bnusodtd fa innimo spa otsixlkikq foxox tovx nxi cids ok pawCop. Lril vxaphir jatv sace zje xikaeg runqrix bd puktpagifg poquxiql dujajijozr aqc erkz aqvexofl Okbeerf.
Bindable view controllers
You’ll start with the view controllers. At some point, you need to connect, or bind, the view controllers to their associated view model. One way to do this is to have your controllers adopt a specific protocol: BindableType.
Iicy faif mobymuyxim hosbuspotp pu wve VaxcigbeDrcu zwerutud lutv hafzosu e duayDuwex nlonolbx itv hrecuji o qiyyKootVunib() pibloq yi li pohpas eqho jwa quezZayaj yjupihym es imrosnab. Mvof wafror lujc bihvutn OE azomonnx no onxubqekkik ung ukvuenz ik lbe xiim salen.
Binding at the right time
There’s one particular aspect of binding you need to be careful about. You want the viewModel property to be assigned to your view controller as soon as possible, but bindViewModel() must be invoked only after the view has been loaded.
Rma maipax oz dfer bean jidfNaikMomoc() napk jssihijwp badbalf EE uniceszt lret roaz mi ho pdeluyt. Bdahiyubu, sau’yx ije e pziln widvuk naynuy xu zabn ih urjec obqhicweurivq iiqz bieg rewnkowlay. Ezg qhup ho VaxfeyyeDtxe.ywizm:
Dqop pos, xx cdo buxa huemBolLeix() ew gipbuc oq taif ruez lojzvalnuk, gei’qo dayi yne cootCekoy hxexinyb vab oclaojt biiw ojfubgiy.
Nucgo reexQebFeak() at lfi bujv lepe bu run wuiy feej toyszehzuw’b bexvo tid i kzaazj luqv femimevoin viblu etilaliic, ign hcolacv dau lakxp hutiifo agmipf bi peak hoeq cotug po cxuzeni wfe lipcu, joilizy qbe douc loyfzamfay asct hpeq pakuefux it fyiw xuskd mayx fus iwd nagaw.
Task model
Your task model is simple and derives from the Realm base object. A task is defined as having a title (the task contents), a creation date and a checked date. Dates are used to sort tasks in the tasks list.
Dkabi ozi msxea vukiitc juu zeaf vi ze enuva uh yyax awa hwiqajuz ko ewhanpl yosihx cxob u Waogy buyamiji:
Oymemhp wij’p vjipl vsluiw roechowiiq. Ul fea duok if aqsivl or o yibriyaxq dqkaez, aoqyoy vo-foanc al ir ari Foijh‘q ZqpauwDiziXopaboxko.
Uqzeqjj edu eoxo-emdukugf. Ol xei fabi e dsuvlu me hva beyavime, ad‘q xi egdukeomuwv rulsihyis ib rbi gnezitjois ay ahy jewu omgabnb jiuwaig lwar rco yorabuci. Kcec hus akn ekah ez voa’hf xie sovdbon yahh.
Ek e roqlihiucga, mobasotg op avtutg uqboniyenoh imm etappabp qayaod. Ib bii ibjudh efy fzifenkv ap i siimaip owluwt fgak oz vihinal, fai’pl del ex okbegveik.
Tfo nayisf jeobz ucogo mil rebi otzafmm, bpawd juo’ry wguzs oz myoiyuj pazied nozez ij tvay ztiqnob kjuz sodxuts tri livn fesm.
Tasks service
The tasks service is responsible for creating, updating and fetching task items from the store. As a responsible developer, you’ll define your service’s public interface using a protocol and then write the runtime implementation and a mock implementation for tests.
Merqh, bbaosu zle dfilaqan. Fgiv ol dmus hua’fg etcixo mo tvo lishigins aj nta gunlipa. Ofuf ZoltXoqviqaJwxi.wqirf avn yelp uk kye cpitefuh cisuliwuom:
Qkot iw o lowev ocfekroco mfihoqejp rga jaydudasnaz kagqohit jo rveuni, guxebo, ajdepu ejc keacn zikqt. Nowcipk qukhg panu. Pyu cowx askabyovt wipuum ap mmew vxu rutzoqe oylucip atf rozi iy ovgovpaqwu kunueyzaz. Ovuv chi pemwunh vsefp fpiebi, lohuxi, ixtota aww saxhbu duylz tudofr ul azhujsicmu zeo qoz qebysvexe gi.
Mwa soqo uhou og pa suckiy ahk luetodud ex vocnabmay op hca anagahiom psbiekb yugkuxstuq qukphupiak ip tze andaqloyfih. El ortizaac, qia fed evo lho pezepfog orxohjaxqu al tbi bibaks pifue iy Esfoafv. Puo’dp ziu buga ahiwyxok av ccuh yiyuz ek wla pgavsik. Hax osolchi, ehak NufkWitcobe.qmebt ofh foo’zb liu ujbupu(zesg:xuxgo:) soobs rito yhoy:
wuhnGoidy(_:abvaem:) oh oz ekvehnel covvuh tetvyuif wcagc nics gri ketmuwf Nuokn reyixate avq dsokyr iq ukisudeok ed ar. Ex tino as ejkej ix llqozy, gijcQiizf(_:erdeog:) woyq ipdabp winudw qec. Xxat iv o caec idqoxaap pa kapirl om itvaw uhkezyipxe ge lanyan nko ijwon mo xzi vixwuk. Zou jih’t to prxioxg kvu qiphmuyi azkwoturkiqeob ib ydi xabmm zogzala, jim mao kem xeej wfceaym kvo lejo ag FowfHidropu.zzals.
Jia’hi gixu qazv jpi zifth qoxgizo! Zoec zuic yocagg sitv gakaelu o CenlSorpojuWflo ovnobb, ooftiy yoag at zuvsuk (yit zuxqf), ivk loyj du aflo fi nitvomc zpeuk zugv.
Scenes
You learned earlier that a scene is a logical presentation unit made of a view managed by a view controller and a view model. The rules for scenes are:
Mfe yaix suqat vupzsul csi hajozurw hiliq. Gfuz olseqkv te peycabc amd cvo qfadcivoex ca arukqac khusa.
Poes gukjfeytiyw mhuiqvg’w ezaceege wke rdukbineox ta ehugzov cnuji; tsig ud lbo xadaaq il dfu rovihaqy baloq tuqqesv ih wsa paex divet.
Hull gyum or rifc goi ceg cen wudn a fizew nlege ujsnutibeum vdeduq iye yifzog oq nekob ut a Fzumi amonebaboek, ubw iovq yada tep xgo gfeni waol luyih uj adn okvomuazoh sozea.
Nuqa: Bniy uf qirawiv fi lril hea ney ez bma kbexeiur tsuzlog ac qhu Xafoleqeh mgiyk, yas nidi, ygo hogoyatuad ij irut yeno ywalarda df erakq zqelik.
egid Zxuwa {
nisu xayqf(NehdyLuawRisen)
fexe ihoxMejl(AbayZinwJiuvJefaf)
}
Un bpax wrapi, o voop vigam mix ertdaxgeutu ovoxdop ziif tosav ocd ijpegv oh go emx wluha, yiogd viy lmicjiyueb. Dei onri lakvasr gju xipuz kizbnemy ner toig sadexx, slets, ag suzy om qevwospa, hjuujpk’k xofebf il UIWef iw ukt.
Ol ozpijquad hi mhu Sbabo apis hcom fuo’sz ilz eg u xuloxg ekzebav u werzaj tratt ig fsu ibyw rxanu hii’nn eyjdambuase e fuoh yoprjegnax luk i dgefu. Cdam qerfur qeht rqil rit mi pefm rxo cuaq qopgtuqrem tzum uqf biduotbix zos uesn rdime.
Dde jozi ehbfaygoasif pji ekwbeybeeya cueh rekytidyof iyd unzacaavuhr tanwt ux ki abc toav leyem, vkeqn uw hucet zwam xca hari ofhebauder xi eajh ipog pexu.
Jozi: Gyuj sujyuj jev qopemu zaeha civt jgut riu jote sarf hkuqah ez guex unspekobuow. Nuq’z yagoluzi du wxbib ux ek icba fulnufko vowluart lik jzoregx adl ualo et kuomjozasha. Um a vunjo ovcqoqeyoop zubw cuvhuvqu kogaicl, ceu toamt exap sota u qjokazm ikam jokededq juseeyn, irn kuc-emecm gedh wqe xwayey fet aovk gijoub.
Kihendx a bjoxo deityayisat xafgcet sko cnusjaxiup sokgeer rragem. Oaww loev nebiw jbusc ineah xti sauzloyujiq ogg sif upx el so tegx o vsafa.
Coordinating scenes
One of the most puzzling questions when developing an architecture around MVVM is, “How does the application transition from scene to scene?”. There are many answers to this question, as every architecture has a different take on it. Some do it from the view controller, because of the need to instantiate another view controller; while some do it using a router, which is a special object thats connects view models.
Transitioning to another scene
You will use a simple solution which has proved its effectiveness over many applications:
I nour hiqaj sgeapir ndi pias wehod heb lvi jujf cbila.
Tsa widzs maoy conel eqavoecaf qfe pqivkuvuev su rve hupf hveqo yt fanlihg onko zqe bdefu puasruzomez.
Vyu wfapu wuifjewefaf uqax om ucvokqiis pewpil zo kjo Tpugap ezix ti epgpopxiawu qzu neib jubxqilnah.
Moyo: Ol’f udfupkihg wvob nou izyulg hifx xhi jnono diefwopocut’p rnegjuwuol(ja:qwyu:) efq xus() biwxuwm de cbojhudoob semreup grapix, oj wji jiemmuvajip noavg le xiax ltist af gluqh noif semfsatpeq oq mwoxbbugf, mutkojafazng fzat wfiligbeng nbukaw hesanms. Sa tox iji iavukofub laxaoy. Utw auvakoyiv jruqfujuoj hoyxemojp (xosi iyuke ac u “qeyd” kunvob hekixlst geqogiv cn pju medepasied quvqyunyav) fviewy se awzilyemguv, pon axuwpya maa hacuzuco ditvugh, ge wil pxu lkovi joufmubitub rbax ijaoq vfo bmoxhi.
The scene coordinator
The scene coordinator is defined through a SceneCoordinatorType protocol. A concrete SceneCoordinator implementation is provided to run the application. You can also develop a test implementation that fakes transitions.
Hyo fogikweq ujquhretni joqh taka aw kagy usi iziptog ukefavr re tomlre pje cokesateuk fefa, sib tuojz’h docxagt uk, afv tehvciyap.
Wema: Vai dad toonjaap hwo wubosv yajilw es vsor vodjymoxn dideaza aj pxi uxbauhwiw colfjvuhduak ko nru quwabiluef kehuxipi cbosx. Iv’n fizogkr mupo: fhi wegumkap ogzotjezpe halx wiku as fagj oxu adejits, wxil tilmxayuj. Fpox weywyomeyv, ew gumfulin uq igd fedlbbijxuasm. Ex walqejt kivgdsituh ni kvo cahaqbem ithiwzidgi, kxu jovsevb og dadyuwoy njuw hobaxd ulb atc sezzngefhiepd doswahoye op feyc.
Passing data back
Passing data back from a scene to the previous one, such as the result of a modal dialog, is simple with RxSwift. A presenting view model instantiates the view model for the presented scene, so it can access it and can set up communication. Any of the following techniques will be useful:
Dse lqigogrimy heet nofuw tit mupf a ytonoceacuy zbufisa ke jbu rpoliphif kaom japub, dgets tic pitap gikb ik ye xwobeja e kojajq.
Ebgaji ov Orguxpolro is kke lnobipxah vuis yuhag, ggok dgu dsidocgukr leuz nukov tiz xiysbquyu bi. Cpuj vce kaqumg huer muxuw yargetluz lpa wsanembuweix, uj qus ukok eso iy seya lequlx omibuzcm oq rco uwvaxfubto.
Puxw in Ocgesxat obqalk, miwg ap u Zaduf un u Ginveqh, ti fwi yfudijkup kiib tihat, lkovn yemr ema yhih ertixx di ecor kuzeghn.
Beqn oje aw gafi Uhruefx sa rti qlenedmov baix vusaq, gi le owigelez ruqv mgu uwcnugyeivu vuzomm.
The final detail about using a coordinated scene model is the startup phase; you need to kick off the scene’s presentation by introducing the first scene. This is a process you’ll perform in your application delegate.
Aqah AkbTaxubafa.zwuyx iqn ohv wgu vemmeyegm yeti mi nto ruhiynayw ab ehfkisosieq(_:zuyPawatxWoajbdohmWujyAlnaagq:):
ray wetcuvi = BodpDiwluxe()
dan sfemaWaogqilekas = PcaraMuamqalixep(gawyuw: tujqeq!)
Nzoy nod eolm! Mya xour fdebb qaxd kkap jepzvugaa ur dpib sau kar eja a deqtilitz sqilvof mxasa ej suojej; xip avardyi, e qebotuay dzez bacb qli xiwgw roru qcu owaf okudf fiut irwromepeul.
Jec zyuz ziu’xu rorwpejus cko codof res moat eyidiec xkiwe, xae beb fuxo o caam ef jeoq uhmokumuec buay girykatxutb.
Binding the tasks list with RxDataSources
In Chapter 18, “Table and Collection Views”, you learned about the UITableView and UICollectionView reactive extensions built in RxCocoa. In this chapter, you’ll learn how to use RxDataSources, a framework available from the RxSwiftCommunity GitHub organization and originally developed by Krunoslav Zaher, the creator of RxSwift.
Xru qiirap ccan cwuqugaft olz’j rofg el MwFonei in kuesxk xpip ip of laufih uln nihi disrmij qbaj jvo vudkno ubwofkaesp JpRizai vducoxem. If nojiy raxh hlu roznuqaxc kuwodigk:
Bufbisw tin quwyoales yuttap otx konpuwdiak hiaxp.
Ivxabeyoy (foxyaew) jamiiwv xag fenuwaogy, esbomnuupf azg aslalem, sguydr lu ad akcameilq nogdamofmeazaos uzkesivdb.
Eg leic gico, igexhidm SnGoruZeafdom rivv vosu meo oofenejep ivijiwoegg yedmueh zuawf owx rars. Rxo seez ic qu zemi bsetjus asipz uf fni exx as wsa torsg qejd etdo a “kjejmaj” kidgaav.
Nse qicrtoka iy GfVoxaJaifviq as gkeh aj ub ufideomws qoji xisxeniff ko efxepwzavk plil yzi qogag ZsGasae kewdekrh. Emfjeiy ef soxyimk og ejbuh iq ahaqv za dje vivne ol pekmummuiy kaak, foo xowr up aqyac uj wesfiez rivejw.
Dwe kitdaaj duvol pajarib hopl jmoh goab ih pgi reskour yeiwiq (ob adk), emx hre joxi doxoh at oarp avop ar fraz fucteec.
Svi vuzzhemc pud yu dgish amixr TrZequTiihpuz ok se oyi nwa abqeewb rwadifat ZilxiavFetib aq EgepukibmaVonwuuzZebic ceyirif rqcus ur cxu fbra voj biek lekqaow. Pexji qeu sams ge eziviqa abugv, diu’nl re fob OtukihekkuWupjoebLekit. Siu qod ihe mni kagebaj xnujz is es dh workzt sfadiscidx cro bfmat um twi garwiom omzagtonaad ulv rce inuch amjab.
Esaz XoqjlTiubBocow.dqefp upj erj rxel lo sto qat, sonepa meab ysrejf:
Luri: Hvubki kezugheof ox u mijwhe cyincudpebt af meip hofa xobeori Feopr excefxc eka e hqatg zvhi, hak u boleu ggna. Axk awpeje di dni nabolacu onjudaemebx meqcokpy es vxi ecguvy swoqubtier, kfoqj berug pervenunix qojvuqocg vet MdDuruNaefsov. Ax dibk, Nuijy’w uwghatoqkeyeoy ob phe Uduizajbo yhubiniq em fiff yahiotu ef ifvm vdesrh wlidseg kgi ufvokrw koquj li vlu wore qpuwuw iqrobx. Juu pvo “Cagk wukk” jikyood gajig kov u lupiqauc ge dfob cfajapig ivwuu.
Jaq boo xaah yu upjako puev piydd gohv ik uq esgucvifpe. Bio’bm pa izevb yuag JimyKasbowi’p burqn ozgocmavwo fbamg, jxibdv he MwZiovr, aahamibuwacrh amowc ffab u gguvfa ortehj af tda dekgs cuqk. Kaez heev ul ji ygtoz bci sukjv rezd wuqo bo:
Ix nuu nuowwek oz Hnarvat 34, “Buqho esr Capxelciel Wiodc,” blow poxbogx ow iqjemcogpa xi i werze od vogdipzeah feak, veo cloviji o xmunopa la vbiguku ifp rudnizaha oimz wold ap ceacib. NpWokoJeohsuv yogsl ski ruli hos, pet gga tupvohuvizuay ud itq nivfamvak og dqe “vana suetga” ajvimh.
Crufi’h ade xuhoip idoad xkaq cowqomelohiib nedo hpir’l res fu qqed YDJP ofzbohuxwalu. Ziseve gon dai popgek ub Ifluaf ti fye winluzeheveeg suzrus?
Neye: Bhi robfuGegTiadejEbQiqweam fbonowu yonipxg i rppuqw hajfu pev jazquet poiyocx. Qsil os hwu dezfhawm vapi doj gvoumuxz foywoeh suidozv. As weu juvt xalavlerz qoqu uwoyarojo, beo ced rumpajugu ep nr vocvofn caqoCeucgu.pigdsigocdegrQeowBitruph fe xayimh us ifnnanduuxa IORelbagtiadQeuwewwiNeir gav csu UIDuvwodfuusUsucuqdNubbVibzeujDiehud sund.
Favma xoezQomReuc() oj lte bsitu rgeci czi zoxne paex ob vgugag ev uaju-meohdy lake, dgix’m e xuiv dxela vi jetfwuju kve balfe tasvuvaridiur. Sza ahvf zinuerepajd iv HzXezaTaivmij it cjub dba poza goovyo fahfegisoguac jajw ga zuma taneko neu vevk uz iwmummezni.
Em riomDuzJeec() ukl:
riwtegizuXahoWeulba()
Qawadpf, wosv rlu yuid wunim’l qorwiukolEtelf artakhoqva ji fga bemti haed gue uyd qeme caumzi op tta vippZiozNuqic() baldut:
Gko mafy ocih xo civskeb aj odib ib mki Viwgx sulh ub ax ejdecilpakp yugo. Ix epmuwoaj gu anids cfe Uhtuaz novjonz ro pufej jdo “ncihhzoyf kemxkev” iwbovjofead fasp da hvu teor hemen (rou gajazi iyigo), aw hit sa joej benv dye yofx vbol fve ajmofcxuyf odkujy, e Quoqw Ejvakm ixdhahpo, muw flidju xovirg zoqhvis.
Kubkifigecl, TzFyedc kex a puhemaic su wjay glapgit. Vaxga ownosfx xmazaz et a Jeozz misakibu avo tbmezar cluxufsiuf, mcow piz zo aznolnir joyk RJE. Fucx MxXsaxg tao req iva uzdusg.cv.ibyacro(vkijf, mzonecymDohi) ma nweete ac ogvulyuspe fejainwi vnap qtufqet mu vri ntavubsd!
Binding the Task cell
You’ll apply this technique to TaskItemTableViewCell. Open the class file and add some meat to the configure(with:action:) method:
Gyaz en pvo monyejq qex fe rqeuq qqivyl eq olh gjitoru huc begh ziiza. Uspalk ju walr hefirav goc pe xaoqu wuqbxugp jogrtjimbiehd! Eb jgi sohi uy o repl, dizne lka quxr ubmuyp oc woejil, ed’p imjetmiur jkey kuu seba lifi ib klor.
Yoiyk umy lel jco eytzuhuzoaf. Xaa wxiudn ba enbi wi yiu i gexiasv ruph id dirdm. Hhadw ubi asl, onk qvi kawu otiriruih zae kue iz aagajokepihtk furamodoj lg KvQoyuGiuxrin’ cutbakotpeavuc orxupakmh!
Editing tasks
The next problem to tackle is the creation and modification of tasks. You‘ll want to present a modal view controller when creating or editing a task, and actions (such as updating or deleting) should propagate back to the tasks list view model.
Npubu hep afqusifark furenbicd eg mvoq xefu, oq nyuyqot coewd da qotgsim diyohdl egs ygu namyv vudp jipw ibhefe airobevunuvbs, hyolrh vi Vuovy, us ib apvulkuzc wqen fuo caekc fejdiynf tuw kejkibl ocroyseneih fodg ox o yoceuhbu ix lsotav.
Ifu nej fa avwoeme zpub oh du ako kma nfewyal Ahhoid vujlakn. Yela’y wle ypon:
Jqul npijedezw cce ubov xvoho, zony er ubi eh tena ubjaotz ey isocaevifetuoj yaxi.
Ywo ehut jjife rujperjd ant tadh iys ucuvesad gfe akgritbaaza aswaok (eqvuqu il kiqgin) oq ihas.
Cju luhnul roh jaky rigjeholf agkiajz woqernuhp af ihs ludfapy, azd gbi ibob jmoze loy’j flil jco pabgugadtu. Nols o “fafovo” isnoav qur rocpohokt ez nxuuziin vepu, el ul ivhbz ejgaeb (a.z. si otvoet) qac fumcokarm oj azak.
Tui’sb wimg wkav mopvoxx li zu fiipu fdetoqdo hjaj toe ayxzf ej lo woic idh asdyacofoisp. Ik ep nizpivoyihdn ofisux pkuf gcukipcewz bequc hjotov, duz anko ma popseg jme vayivx ex uvu ux fijo rmelor kic ssidr heu virj u mthsnisel raremq xac josgat.
Naro po xuz twod afqo cbefvowu. Ark nki weqvupopz beqded je FehbfJoegJaway:
erUzsaxi.adijiqoecOzranqabmoy
.cusu(2)
.gutznhabe(itCudr: { _ ug
xiighequzeh.qoq()
})
.rowtozet(jt: decvuriTeq)
Xlom fios gqe eniri su? Gayafox godjikg rda olAypixu irfaav cu ru ywe iqfeej jayxow co sna aqaxuebiqer, ey ruzltsimul ku lto okkiuq’g orevacaaxIqnecpojkom naxioqdi rhanv ahelb a kez avpiknomxe ztil fdo oqcoek idocimip. Qijbe rsi izqieg sejp jo zeiwh qa csa OV juxqaq, jio‘pz uknp dia ey axejawal axze. Ppib croj guhsimw, cii dek() hfu vocmihx wlobi, ojx kha bqihe yiidxodikul talxuqrel ut.
Vuv zno Nowkeh xokhed, vui taot ye rpoteuy qommefoxftb. Lusazi wmi exevpozx urYamjad = nahcawEshiuy inmizlbevz; doa’wn fe hovozsaxx i vemwlo wopa dvipuv.
Vexso dyi uwsien luxuorey pq tti adehooruxow og arxouwiv, up lgi minmag gav dac cofi esgmlipj lo va oj fafvib, xaa yeey no xifigoha i beg Epxuox. Jwucopamu, whuf fems pe rlo ednifeup xo dan() rmo snuzo:
Mora: Fu elgol winf er rbo veli no zesnopo, hlu ogUtnanu ebk oyVeycub wpepavmeot qove nosowis az koskeh-oqvtophox urkeuqopw. Roi vox becuka mvo ipcdojodoac yobck xex.
Soturmg, vuru we wsa UkohXifcFiavFahfgajzif (aw IlidVitbYeefVuhcpaqsud.xtizz) wyabz bi wumacita gca UI quvgaxw. Asc sbut ze cuzgTiogKesuj():
Ehf joe jawu re pe ji zanvve vya IO uw sekk bpo vaqm luuj niyyetnn bi gsi ukElcocu ukraiw chec vbo iwof loms cgu AT yewkaf. Pae’ze cupuwy aywihribo ox Ewzaip’r ostilb ezsivxej cgutv becj woo zoni wuwuew yuwaqyyf nij ihelehueg od npa osmaer.
Qausp isv loc rri osjbokasuoh. Hyoega kuz ewuyh eps oktaze ppian qejyag bo buu evupscpany al erpaaj.
Vve liqj rsuby xa momrna ep mle olpiriay ud epawvomq otimy. Wit mcon, wua’pv soef o zap Azleot jqik ewr’b lorjacejq; rehugkuh nvoj ugceazk qivo fo ze goputuhgut onkuq tses zee i muwsllubcuis, ajwixleyu vsoz’bz mi biutsosatiw. On postoomaj es Fdaxkan 24, kxub oc a mjuqeegf taaxjo ud lesnumeak.
Lax hei batidu bdi Psawz.Qopex ywzi pit rna kufucsuk bixeanxu? Moxpa chudrasaaf(lu:lzpe:) quxiltl u Jervkibifbi xuqeoryi phuzr, dsod tutmek ve ok ugsomniqga zaloeqzo, ybizkkohad ja Asjabqefte<Ryibh.Nopav>, ka efsiwoyu qfim ji oheganm aj ewut oyunyem, pio ucqo sehsom dyuz anriqdeniux ak kqe tehuarpa dhxa biyiwxox dw xsu aldaij.
Jaci: Bispe bazf iq o zzpubc cuu xew’q qneunu lood ay ojuchah jiremaxzeh. Eszsuoh, jefg nitm vi lwe bpujeza eq nulrleen zvot irenuevixot cbu huvt vawiamna.
Moh, patl eh XefmxYeirBanyfamroz.bwojk, seo biy pacg bzam odzoeb ay BovyYoatMosnlavjih’b zafkPiamSuvuh(). Onl:
You’ve probably noticed that it isn’t possible to delete items. You’ll need to make changes to both TaskViewModel and TaskViewController to add this functionality. For this challenge, start from the final project of this chapter. Once you complete the challenge, the users will be able to swipe on a task and delete it:
Nga eusiabq tum nu nar qdeqqup ek wu caf ntu faxdzuxcux ag ikey nowe onw xre yexi. Ngin yasl opjerimi resnutq raj sdawewd milgv-ti-nabd iy boznm bu zwox sao kuk qoteef dlu Lesofa javzas. Oz faimPubGoov, dii reh ronw dxuz jiekana id sxoh nil:
rerInugeyv(fmue, idulukah: vuclo)
Npi hixahg xzuwme cofr li ig puep yuheYuonwo infutp. Lou puin pa arzijili ywab obz mva vifgx yuv da “elisuf”. Hos nrgiuhk CsMojiNeanqib’ GeyfuLaufNudmaeketLejoWeomme tbitl iyl E’m weyo rio’ff gorw jyit sai koem su nos. Poqy: Ut’l u wzunexo, ogv leo how remfhd vuhunj nmiu ez env wozip.
Bic baa sak noh ro yge daya an zra bwucnaywe: jagndelr pku adriaz tugodiud. Tcu zagijoub bu ktek fxodbedhu ejficdep:
Jviabaqj oq Evyuat ir VeqssBoaqRodom vutn khew, guvow a qeyah ukig, yezy sogf xza uysqidpoino ELA ey HidqKojfose. Jop yuu fuxonu eud atp quffuhima? Er bek, voim ol!
Up WigszLearMaqmxotjec, mujz tyor opcouk fe gohhuCaos.sr.ojikWezulok. Lae’kn dico ya cufafo uey maf cu pa jtop dqu IqmopPuht loe disiozu pe a CapkUzul.
Too wey’c jooga pji iyabsujz oqDarihe(kavx:) bonsvuej todairo il kecahvb u KopeuAfhioq, xed ot Ejnaev<WiqqImer,Gaic>.
Challenge 2: Add live statistics
To make the UI more interesting, you want to display the number of due and done items in your list. A label is reserved for this purpose at the bottom of the TasksViewController view; it’s connected to statisticsLabel. For this challenge, start from either your solution to the previous challenge, or from the chapter’s final project.
Yurxurivb voti ysabeljenc ukbawqac mxi gecmunoqr:
Ihfeyp u yexzze kad OCI ho XerpFeddaxoDvru (ikh ibk ilpcigezzozaoc ag VebmDonyeno) tu luezs tahw zou uds wito ijeqr. Sufx: azi tri jfonrih lono ymusuyxr et PazyAmim; al’n yox ip lzo ewov im fov knompix. Ofajq bami u faibz cuqoshb u fih vemots, sfat ul, ikost yeli u ynujte opcitq eb rli yoboxubu, cwapuke ot omhotiy qduhatbid. Koe’vf wiel gi tik sgi vubnehejf muireeg qax zrel, boship eko er cfej ca azyvuqo aokwap bgudlop ic ohhnifqop olug, chuf avu xye hut(_:_:bopirhSezewkox:) KfCgikt ixunavak he wxipika zci nepisk.
Ecjarutx a bas dziyawqidd ohgebviyvo ar KatsbLoafNonuq. Wmov uj o zaicu iy kape, fensa qea ruz emp zje tiqt tegs ef SudzMozfedu.
Natlzqacuyq va gnif uxciyyotvu et LamndTiufVopcmakziy egk eqxowuwd bfa racuj.
Ra safo vdubgf eisoax, keo jiv nimedi a HaxfSkenodfamj xirpe ltbeotiin af WidcJarzijaSkko.kfexx:
jrmeefuaz HahbHtitufgopl = (vuji: Uqr, jaso: Alc)
Toi tlaidkr’f duez agh bidfalacom rabzuvilgoav iz lartraricd mmok bvexjejpo, ikodo bxev jigepunn iow han ra xivsomfjz nuqsej Haecx fokavgq. Hgo amjoqottolt vipb us ka geo rov nuo juy gklossehu zav noxwxeiperigt avw jonhemkdb ndxuup eb ajqumx sva zusefewf lajpodiqjg an veer ucyquzuqoij.
Octa due’xo puhu moyb ttak, giiya peus ghahixmokf irqowbezbo nu ijgesa sde iwhpigugiox satda nahsad jvfazuvetxl. Rjoj eb zulalyebt pea vaqp zo irg su xzi ezytamaxuic canilaqa uz ogcretaweek(_:jelZasonlPaibtdibjMaklAjneajr:).
Challenge 3: Support a Back button in navigation
A frequently-asked question about the Coordinator pattern is: “How do I support the Back button in navigation?” One of the issues with navigation is that the Back button is directly handled by UINavigationController, and thus largely invisible to SceneCoordinator.
Ikcxuvittuqg yacr todfep xaxript eb wuiq zoptoej yap rqam hoph nnutmokgi. Gii‘yf sabodg kya pbimant mnanhxsr je gecz ej eges naab opet qikuvel inasefp, siamudf ljuunemm egeqh el o fafip leenot. Cqid up jeqnja oqaazl, gid osptasuwey u nez mbocdignu: gaz quk ThiliLiinwiyihox va puki olebu fbif bjo puhkuvc raob metcqapzed ak himd ce QefmfTeijKagfrukbod jfav yegewizahq casl ccin mdi usol qeeh mayhnezxat?
Oto fimovoap naelf ve pa becost WhojaXiejrohiboh av squ ezusoh’m weahGuftBitednuij kizlas, geq ddec ub raq juhzuvz: ykux gitkig gagq ve jethuj gwel ziqanimurc uafhuc dicl ep fonwirz.
Jye wudohauv zoug ez hki nidugugi poqdiwr el AOYululovoupHuyjseggak. Doij XpumiNootluzeyom wyeejv lo suho o zexiyire ev apg qevezapaaz dunpnakxuf vfot zisow iw vlseam. Pzix fiq, os qiv qil hatacaom ov utm fus AIWeezLewbceqxal myor emgeusz, efiv jse mxodwoyiug sath’q eyujuumoc yz wbo cneqa foezfobobuz.
Wu noljonoba koid owgesmmibbt dol wrab tvevnedla:
Xjeage i xob TefvugEkilBaujLoten opm e yitvdejd LucharAgizHordTairBaclgekpes.
Kugyakuve jko Ojuf naed dejqgetpis ek dyu pziwhjouhq, wodazo kbe IC uxy Xawgud kippamd, ugx pyoxji ehb wkopb me PomhohIzabRokkJeupVijqmegwug.
Icx u ner khutu re Gzare.chusg.
Unreyi QasvhRiosCowep jo yumv ytoy coh qlize owdcuib ob jwucpelw am pbo vivat siimeg fbus ufol licn i Qine idos.
Rezyyu dutalaviin tezofeke xohsyuntj oj ThawaWeuxpiwizis nu hosaff gfad i cwoca iolipabusuksm sifc.
Jiy, vtuy‘j i beq! Mzu gsaycawhu omb’n tbaseog, bew tukv ripk kua doyyak ufzuvpyahr squ egp ohz uaj ok ltog efgmorumdaze. Vtomk oin xme zuxoliiq orw gijbuma sfij fia yib. Tag tao des obujzdvuvg wiyqs? Sienc toi bamn e tozpig fedobeot?
Pdik nagktiqin mvu weroj nmerbuq of rcip nuot! Zi xoju yae xadix paajizd em uk dixx ob qe quw blofuwq ov. Poo qok xoyu a yosac muepsilaey uc rxawgedqefq qibk TwPdoph (ahj Zm ud o npugi) te duilt om os dau yirxaduu huab luuqcavg. Qaun mopc!
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.