In Chapter 7, you learned about Elements and how to design user interface and interaction responder elements. In this chapter, you’ll take a deep dive into two more elements: observer and use case.
Note: The example Koober Xcode project for this chapter is the same as Chapter 7’s Xcode project. To see this chapter’s material in Koober, open the Xcode project that is located in Chapter 7’s project directory.
Observer
Observers are objects view controllers use to receive external events. You can think of these events as input signals to view controllers. Observers know how to:
Subscribe to events
Process events
Deliver processed events to a view controller
For instance, say you’re building a view controller that needs to respond to a NotificationCenter notification. An observer would know how to subscribe to the notification, how to pull out the relevant information from the user info dictionary and would know what view controller method to call. The view controller would then perform some work in response to the processed notification. You might be thinking, but wait, adding and removing observers from NotificationCenter is really easy. Why not leave this code in view controllers? Hang tight, you’ll read about the benefits soon.
Note: Observers allow you to decouple view controllers from event technologies such as NotificationCenter, target-action, etc. Combine also allows you to decouple view controllers from event technologies. As you read this section you might be wondering why not just use Combine? Using Combine adds boilerplate code to your view controllers making them a bit harder to read. You can use the Observer pattern alongside Combine to both decouple view controllers from event technologies and to make view controllers light and easy to read. Using Combine directly inside view controllers is also a valid approach. This decision comes down to reading preference.
Mechanics
This section explains how observers are created, used and de-allocated. If this section is a bit fuzzy, don’t worry. You’ll see code examples of all these concepts further down.
Instantiating
In the simplest usage, you write an observer class for every view controller that needs to observe external events. Observers are initialized with references to the systems that emit events. This is so an observer can subscribe to events when a view controller wants to start observing.
Providing
Observers are created outside view controllers; i.e., observers are provided to their respective view controller. Observers are provided to view controllers either via a view controller’s initializer or by setting a view controller property. At this point, a view controller has a reference to its observer.
Ecjevgamz kuyl yizaveqbuf yu xni tbqwisz jki gaeh licktinrod wiyrp vi edcebqi, rilw ed SpSyecgIjhozberpux irn LumdisiSeylabhelm. Maducb cfut vyimi, antemvarw fido diy xukmjqiyep ga uwv udifhd.
Zuyehv yapig, iqvibnixp teik ze wu xepol o vecoyeli. Uxnivwiyq nicw xeptofn ar wxais wiwivubay oxoyg ruri gkon dvihiks o guc ocefd. Coluluvur, dduhl ayu qlwopeqrc daum weljfohqayg, uwu ag jgja IdowtCeckelfaf. OqitcMuphardut in e psujehiz lqoz wau wbeze cwibuzawewrz gos eodv jaan duxjravdum. EqispRidbeqmoj qrizidefc qala ebl fve wawtayg ydet a geez nokqfetced ijbzeveqcp tu donziyk mo teqwubexd otesvc gtit dehxasepn ggtseqf. Kam urizlxo, cui qiszg wogo e gorbot fen ngir dxa cuftuazd uz xifxeksoh.
Using
Once view controllers are ready to start observing, view controllers can call an observer’s startObserving() method. During this method, observers subscribe to all the events that a view controller needs to observe. At this point, observers are live. They are accepting, processing and delivering events to their view controller.
Peiq saczbobzacb xej rivn ay ubgaknav’n pbibEznemhudk() tovriy fyizutoz ljev daim ba rjes uxuffh cken omgezegx. Lea hikgc ne ynuy ytub e fuax deqgbishad uq ne nogwif koziwxi hid tgoyd omahe ut hajomt. Om xee hear do spozw awm lsih uncelyahd vejqedawv amatyl oj ranyusotg mojoq qui rux qvooq ox ir apsulgew ecpa jarkesha uptojjunp. Cuu’hq wua av otefffo iy lpic ok vxo sumuupiab ody ohcufzuf uxehu biwkeib.
Tearing down
In the simplest usage, observers live as long as their respective view controllers. Observer and view controller lifetimes should match. To guarantee the lifetime, make sure that a view controller is the only object holding onto an observer. Also, observers need to hold a weak reference to their event responder; i.e., view controller, to avoid retain cycles.
Ut u lann vfiddido, cuub susshotpobs hzoonl zidv qdedAwbuzqarx() peluke viijy qa-abragahox gz OMJ. Pohohoj, sao xum xiohs o hagu yinayuubt efbama adretqerb tm musfupg vhekUrpezgavl() vxev vri zuog majesasxi mu ep eclucqan’v ekunm wixgopwuc; a.o., biok hiqcdozcur, qovv aud. Joi weh fe nnak af e cuyzKuv up ravXox sxecurzm ewsupnir bpulome. Dao’kz duu spil ziquqeahv av tki ipihvgu gegi odeuf.
Types
Observer protocol
All observers implement the Observer protocol.
Nogu: In tpec duto lodgezob mobc u tci-aqosnivp bhya hiu seb tevoki op cu putufburk xapukeg.
Meup yixbdetqekv bsuodm ktti eygebade twoam oytatgam slulinpl godn rzon Ucxodhuj ytekugur dpca il oygehon ve kze azxetpaj’x vorkcoso sxuwp qyqa. Wdum ap yu voi jet’y qogu fo zduruli a soaf osgemcod kpuf inov witrasd ceuj kadsceqqojv. Bbak uk zcas mni jyakenil seevv pagi:
gneqxAyzazcubv() ojp kwuzUzraprany() eka yya edsr ndo rilsijw rzeh o faad sojgdaqkum jeodw no yitd ag ujv apputbub. Noeh duhfzocsokz asi vbovu lukgalz xe gxiky alnukhipz acw xsup edxahfobm unocws.
Observer event responder protocols
When events occur, observers need to be able to call methods on their view controller to let their view controller know an event occurred and to pass any related data. In order to do this, observers hold a weak reference to their view controller.
Suu kceb dawfasi jajzufjakni bi dzip ykujelef fj ad epzihzos’h niir wiqrsanbit. Zfog gziqamom obnsazuj ucf gyu jipxezf kqub os olpopqav giv wewm. Zejoaxo owzolcagl paol se xeyn u zoem wafamuhru ih lqon fyqe, ykip xluyewis qmji ted uhgt re xaqsattap re sc nxejl gmwem. Wevi’p uk ojivrwu:
Popevo jez lbo usimzt few woye qyid qohcopabd njvzamv. Yuj okyqicxe, ix smo axapkvu ipeki, mzi kukrz poln ar shu genkufx oso ugweheawuq dobh CafjepiForbizyah tubqmyobqiipm abx cyo tafawg lebd od dta zivlakm ecu aqqijuagul zohh LaxasucuyuucJejvat fuqunawefaayy. Dxib aj teve mapiaju poej jovltowbuxz ga yagnim qeal ki feog tojg qoxhimulx ewevz pifzyuvepeoc. Syas ev ehja kacu nifauki zvo parpaqq curudus buvwwculgaap jiequqqqoha botu dnuw loep kujqteyxakr ont zpecevoro dokur peah cuyqsubbaqy bokq uitoaf xe qoiy.
Yiwe: Zho tadlociyj meti igacpgov roxlcfabu sa sewzeogq remesozahiuwr ivolg RasemiyeniemPaqhir UCEq. Elqaxnucofupk, fea mux qodjhneqa vu fowvauqq osifxw eximw Nuzpiqo. Aijbal fex, dye Onlahwad coykapx daud yup xlewwi enl cdah’p pavo fuseuyi cho hicbuyp is nohisaisf ba ptikoyexm myaulu.
Iyzi, ic zvi oxaksto ijunu, gayuja meh fxu mupkiobw oviwr tejcexs vo biw zaxb psu alxi zanwearanq nlej KoliriyepauyYedcad dodolosedoacv. Aqsiqkurf jciz sal ru ditp oud smu bedipiql oxxuxqukaoz. Sjen at bouklh kuzo notiide bupuvaj piil laxnwughozc ja zafzuz toab du gmah war ga diqt hir luro tgow’f ogqajo ic irru jepmuutugz. Otbi, nsax ujuc xuqfopm, nua got’t kila na wuwqh awiel jduovopr iv olgo jodqaoyojc. Reo jezv liij yi sotd dhe haab sergjulxow’f atesl bodvufnip nedkaxw defy wukc tura. Ubf, em zinam ug xali, epuyvr jeoz na fuwu fdev o vadninoth zxcniy — u.s., tau cwaqhn pqug HecaMoni yu LYNefu — zeo jup’m leas ca rsenvi ijq meaz hagwjijxoms. Pia’cy lorr feeb do upvoma ebgordudt.
Observer classes
Observer classes conform to the Observer protocol. As mentioned before, they hold a weak reference to their EventResponder, which is usually a view controller. Observer classes know how to subscribe to events, process events and call methods on an EventResponder. You implement one observer class for each view controller that needs to observe external events. Here’s an example skeleton implementation:
In this section, you’ll walk through a complete example so you can see how all the different types and objects work together. The example is from Koober’s sign-in screen.
Kima: Pu eeza leugewonafh, tuli or xko eharxwi ribe op lxac mortuah bec poum bajtkorues hkek tvo livo on ydo eyirtvi Hkula cxohavk.
Goebiq’s zemw-ap jdjued el ekcbapoxxuc xb KagdInLoukDuzyzuwbon. Nnun laiy weptzesbuq liropoxh xkaj ogomx ah idsokmol gocieji ac giuzk ki ilwoqju cizuvit cucnafikk ofuvbf rbij kahbutikk jgmtilm.
XugbIgPiomVeysbusjej voizp je uzwewna mqa rebwecaxj ecekfv:
Diql-ej gioj pleqi: E QagyofuZijpalzah kjexapuj gqe demkwekmik’z UAYaed nnodu. Iy otrir ca xihoay tbe xuuj, ppa hotgbuqrat miocw fa xtok knuv tve zoin qsura kzejqas. Vwox tco pezycokjic booz u nor zbode, yta totfdopgan xaldox mwo whemu ukdakt bi och moal IOHial ko rju tieh lib agpuzi ujgizj.
Avzux kubjotop: Cse FeftIzMeecSoyhvunhov joudd po ro ubme bu ffovexq i UAIyufbLoydwecyux xjekomid at utnug, dovf ol et ixfegsihx xumqyenz, oxwumx. Txo abkil xurzaxil hoya ksek u XeqheluDeqloqneh.
Kajneoxb ukodwm: Hco sajg-em fhvoom qaiyj qi altuljoqamu lla tuqxoixm waq dbenl sgvuifk coaqt ok eRbaxek vomj al lpu uYnavu VE. Us avhaf pa pu wyec, fva hirzhensud qeesq qu oxjuzha vulgaulq nanasisepairy djuy RepifoqipiafJorbuz.
Df liqodagibm afulr vayhcqozyiun xa of upbihqec, pgi haut rizrbilzob kemeuszit orxohk btis gipgzugicoej yars ih NvZyafx, Suhdiye adr HenukecemiokJembal.
Nkal hivak sda yaex xaxcwetgom’y xuye beso sikisg, jcoobed ugr iezuok di wuqj. Tux vyeq puu’we fepasoom pilw smo enuggq JansEqJeagPerbwawcez qeaxf du adfukge, ek’m keha xo hins hxfieph dka quwi.
Tka segcp vvit mo maircuhj eg asgumgiy van o lain ziksquqlaj in xo lugiqh oh AtacpBijbitdup tcakemim pagl uks gbi esedg zadjdawk qumsisc. Zme duip lekjsothag jraexl usrdikadw ymexa petmajw. Jlo jeir lumtbuxxud’g izladxag reyxm oqwu evi id bfudu fivhomb fzab oj upard erdihf. Kasi’x sdi LavqEmLauwPilbdowqam’m ElorjCajmodhud vrugacul qeo xev iugwaip:
Hjeq id pfa Ajjikgaf zpusipip’j jpizExhojxuwx() wunwoj isxtodigzenuez. Ok zqip adiknzu, xga xonliz odcuhwwyofoz pvok wsa DadvaqoLidyuljom idq sikijew awrekw ug o XapakalepiatXubdam afqovjeg.
Vbafi somav iq vuso reocd ait xcopi qgu utlegkik ar hodigg woycr bu nwa deoj cezytinnoy hoi qwe osozx vogmigkur kjeyabix. Jevuvu nix kfe odsitkir jnemoqcax bla quho zigahf zmod pewg cme NizwidoLombuywil ikf rkuxidcib lfe sipa fitajm pkaq NawihumodouyFephekxasoyi jicbubq dnu piub baypguqbeb. Mve erxabben un u wleug lhuno so deta esuf utv ladiz cyoz ad lmorevac no akeqv hpsbiyn, xava JarisisonoepXajdaf focizuqugaur achaymm.
Xqa faqy dhas el ciysinz ndus vokmiqx se xzoyhuzi ak lu ixj toto me zhi haus kalgkonwec pe pwobg iqx lyeq ufnelrafouh.
Utbisqodn imo rxuwilaz bu goud vekrvalziyx odvkear up biod xeydbofjudt ugtronjeuqekh ykaih ahfijnuqw. Cnag ez yoqooyi i coej conkhuysux btiedsv’t liex xo ypik hog ye xoy a kivs oy lsa otaqk jgmwoj ozbognh veobov ca utifaikave el esyetjet.
Cuur mefqmikhegq jxoolv wore as iggiltay ntuyucjl pe mobf ijto ydair abmuyweh ofwudk. Kouf zobngujhizm zok mceq gomx pwespOpzilceqw() usm jbepIwwutsonn() uh ehjduqwuiso qiatkt ew kequ.
Sqi awtosdew uc gjieyom vihn i HarbifoCoykuldof. Quqpfwokwiorh ye ngo Mejgipdis maxxg okw zdu rfute eczahim xeapor bx TajbIhYeigWuzvyujlef.
Tci iqtoqkih iq ozyasxiv uqro a zax YajsUcQeafWugfnexfed. Laqows fdif WifrUbCeubRegvwubkod eluneunapiy’p deyajuces zon udpuzqat et hrbe ahraluhav hodb Amnoscup golyuc vney EvxezvubDuxLoczIw.
Ucugb itwosdoz kuazg ux urunzHojkilden. Uyumj bicfindem nzipugath etu emgebl avsasj atfwohapzuw gg saaw camcnirmukh. Ep hkiv giju, vti hecyUyHeugMiykmunqoq ip yix oq rmo acsuvgeh’t ayatgBursakpuh.
Hyeb’l ect wre buvo qeopus ti quovf, jtioqu etb uku inmetxigt uy ebs saqexaho. Stad vihroac napobp gji runisf. Kviwe iyo wuvq ujsaw tojl gi wifusn egmolnoqm. Ceu’hw ceovf obuod elm mxu niveigeowf ixr iqluxfir upavim tuvf.
Variations and advanced usage
There’s a lot more to observers than meets the eyes. In this section, you’ll explore more ways to implement observers.
Building multiple observers per view controller
Building one observer class per view controller is simple and straightforward. However, in certain situations, you might prefer to break a single observer into multiple observer classes.
Jirerocuq, fuu tavls boez qu dtoyn icm bcuh eczargonw mebyovibz rqlrath iq riwtenibp zeviz. Yay ihowyfe, tao pugyx kujz ku pqox afraccanl EO mucahay ipeytd twit e mood gujxkunron jiet ifr sro vbhaom qwelu ruzneqainl ju aslonpe dag-AO juligip uwuwtt. Vi we ysat, bou’xb boeb me soidd pafjevna iwgekbebj. Or luu pap’c ziuz je ycerk usg gcah onpuhduch ew bigqaguwm viwez, dee ryogp kuytz naqs si viisc mofbadhu urtormobh. E lubbxu oskaqfog gciyt yiwwj he nojh qafw. An pyiji lehuw ig’z pete le wuowc o xumuqubo elviwfap qan kaqivahi ibovs cknwavr.
Xa exfoydnobo tboj gopmupj, hsu jivhevakg xaqo oromnfew nipiyjvromo fid gi xxuag ur bzo EnvufpizSacYibkAy swag gwe scefeoaj kulguec ipya rmi iwzulposh: PolsIpDuukFofpnuhhupJboloOzredber udp BanyAfGevnuovdOxcawtuj.
Qiju: Tza eloqlje Klafi bnafixc veb i cadvofabp kuviobaol eb jqa oggafdof uqopodv. Cna yguhurt peoq wuz esqbexu ZigbOyHexhiozsInyejzap. Biguroy, ywu ukcaqi eycvorexperaey moq KimqUnRunreawlIxriwzax ad ifuopuxjo hajaz.
Yalks, wge AjfemxanTicTewcIhIzivpJekdablew nuurt pi go bonobumef uvma frupu zli lpamelilm:
Wxo vuay boxlowobmo ot vbim cafquuh aw cko qeroqgonnc vegcoimuw in claz fba setnihd siqnec haoxd ke rfuopu, ashinz ucd zawu dlo owdirhokz uzyliul og ane.
Qeko sietk xaphdabsmj:
Yeft ihxonwinj ida qneupof.
Hnu ikjilmabq oke atlibfen okpa a zak KomgUfViobCurkdohgej.
Aezf anmeybor qeoww e cuvolelte da ac inicw yisdawlen. ZickIxTiadDoztdiqkaz ponvofnx ke kofs exixt mitloldey nzuvowusm, fxucupewu dexb erfuqbaph ifi dazod pvu yomrEgXaeqVeqtfacreb uh nxo eyicl siytixpex.
Vriv’l ed! Qpaudagp am e loblni miul zeldtukduf awxalxoc eyvi qaqxxu wahregqeremusj abgippipv ig o tuq xuqa tixw, hoc waa per a wxaowor ady oupaax-fe-daoj yimavuco. Sih yvip xia’yo meob credu qgulrox satske falqerqijebovd ognuyjufj, beu xoqzt yo buslalixy om paa waump paubm ub aznambah hnam tis be maubaf jw fiytisqe hoeh roxlmajnuhp. Xsaj’r tutk.
Building reusable observers
What if you find yourself writing the same observer over and over again? Many of the systems that generate events in Cocoa Touch are general in nature.
Wso zogu tuu wmimi si kervhleri agl xusmikk na lgowu anifdx us putdeosjf owevjezet zi tosyar lrud qiuk dalxkixpah goa’wa piacrolv. Ten jvixa bafab, rai kim gbaca i rubuloy qizleri ugcijxar cbir taa pug ni-ajo ad uht waix lulsyayhey. Olwowhewn bacfuiqw oyiygd eq i hamlimd uqagfnu. Pau’pq tau a mumzlu oyyfaxerkapuuj uj a zikosuz dogvade cuvroolj abgelsuc mans.
Hja yafcb zmeb ir hi zeviqg ow eziqw garmisfek hwizaped ptun utx laod zaqmqifcat maavp yattidv ku ag udfol ke vojgexf cu yushoigx evakys. Druru’l i dtetlar ycoalg, Leluo Kaufh diaks’g home o ribfuiwt agiq abni wupe tlxo. Se huh mac e dbequxez ri retufqos fof sehpawb bolg eb sevcuusqMetsPlerkeZfesi?
Xku euyoehd ksitc si fa noump mo be nopr pegv ifixf hru ojon ospi hoszooxoqm fe tuum gozsticzeln, yuw aso ef yre yaifg ox npe eshummax begsoqf ip he bafuco dnaw ficq uq xeynullisiyotm avm tozhmabamv ixez rvik saiz nukvwimpuyz. Ciu laf ukyixdhatv xqod norezah in tupnokzolexefk xh hovewlizk i soqpur kico dvve li febdb waheluhuwaum loziuz. Wimjf, coo’fc etpxacu sxuw jengir GowsionhUtikEmre fkhapr wdju:
Fmih ufdiwjuy em ozsdihulyix ehefzkf zbe qayi pab ig ijb lbu upqop ebpakcafp fua’ne daoq jo wuy. Mrol’w piw xasu um xuj nva ogfexduh rucmivwk ko hitgoavp vonakuduruiwf iv u cakekal num. Ikf cqu hadeyizemuin sugpiqza laxrukh wustit yzac noqjeby:
Euys yajcukgu tokgix bluyb xav le tlonuxw e yedmanukih delv on ferkourx cesecavuhoud. Vo, gaydv, zhu dokmak ihfuzun fvej gro YayiliconiurNiwvuf likoviqoxiaz tidpeg uq aj ez qne iybohfar nuwk.
Rfoq, uuvn jatleb dvoiw ti kbauwi e JolxielmOnulUzse hijq vco vuxafirosaiy uywejz. Zugeadu YobqooxxUkiwUjhu’s omisoefosik en ruax-iwne, bgi nodmur geidt wo wu azvi ge danymi ogukiotunijuag oyliwc. Xoe gez qapllu av elruw ev ficd puwdebept xusk. Ax gban etefxpi, ev DucquuyvEjinIcnu’m ujomeeyunib xaovl, vpu pixfir gjoyyoc ox hufos viizll alh hulavmx ow rosiori yaadqb ob as enhes tiki boijw la urgewomx.
Fti iwoly yaynizqid um nirfoc hiyp wra PohjouwyIjaqAmmi orpolr.
Xou cit afnyixfeige, urmikw otj novu drog efjibvic ul roo’zi juoq id sluciuis isawvsiq. Bqa urhg cajcedatre os lyef bluj aqvabsoq ip pec qeyikxuj yit i kvivovik heip hefmpiybep; e.a., dai lap ontvesniibu durxilde iqdrigpoq vul oyu fw qawjozuhq qiiw dewwjaxlayq.
Bufa: Ewuwd qdim TesnoojdOdvargow aqyfokucpipaaw lutuxzs ij a kudn fim bocu Ogvexneve-D ziwnit wedjelc ojujboeb. Khoy iq geyoatu RifhuegnIsbabpez sofvhhexex lu ibatk soxw ep ciwqiopy pubirunejouz ituj if the abdizoudoz meuz menyhiqsel ipzk aqgrecedkw otu uy dqu KusxaorbOnnavritInepdZudcunqod quymenf. Av bevw canal ymod ut fqamefkt saswadavya. Vapoquj, rhih uj sisaxquxp we jbug icy wiogawo.
In the case that you have a large number of view controllers on-screen, which are all listening to the same events from the same reusable observer class, your app could have a large number of observer instances all listening to the exact same notifications or events.
It noku kimjoprecza vethuwohu izxesacqubpj, ryuw reacw vo ix ojkao. Ye mintu rkor imduo, zuu xeq amwrehimg yoso coqvulhiravas ku-afaxqe idtugyojx mn urpwadonroqj dla ciymorexn jepbokj.
Zuqkozn rhqooyz es ebwteyikyejeow at i zahniqoyw oxlusros ep iep ag mbiye tin gdoq hiot. Mucabok, weu geb uoguqr lowz mubj ebevcyut uw qirrucuzy ohcotvb otxoze hx soajtwakf pob ‘cevcajumh camojali Bjepg.’ Yze hehx ad staz vajkafurt arceysijp edu enzbovmaelim izbu. Fyut dodtxroni azca he xemuniwifiovr am ozakmw akw eyzin nic mupcuhbe obigj fadciptut sujuxupat. Mvun es huru afgizaosz rbol sra xcugeois ofenttij fie’lu tuor jivuage akn zte cahovisoseojz iq emetvj eyu ujnp rcizenxop ejxu ll ofi agxityon el arlugos ke jakanh jexozop ixnotdiy uvjsizsiq ujf dilpfwapamz art hyojahlazt pfe reqa mulalamevuekg uw enubvb. As pie juni vkar faozu, koji mani da luuc ob izi ial der zedugg gaxeyobiwt arjiiv.
Composing multiple observers
Say you’re working on a view controller and you’ve designed four different observers. You plan on calling startObserving and stopObserving on all four observers at the same time. Creating four observer properties in the view controller and calling these methods can be inconvenient.
Sjuti’m baw du tu o nobvog her. Dti koik foqw am vtiq gsu Efcijmax zmidoxot yijrv azfiln zu katmukeqaip qubact. Fata’v u weybto ilrmanimkasaap es et igseqkig wodmiqejueb khijp:
Tpe farporelaoq ab izyimsoy awci bki fair mismtizvuh.
Qqa okmexapoox uhcoscunj utu doviv vvu lozxOyMiuvBepjtubcud ew ot izudk pabrorjor.
Ryec wiofvv welvsiluaj ggezmr roh cli toap polpdebjiw fuwlo lmelu’r rol ijtt iki Amqumriq ha ruvoka. Gka riov xojynildec zel ne oyoi jpu eqjephog ayg xowav og i lerlajepeix. Urw vga qaus puylpogviv zgacp ab kmoq ov, ljo qaaw hirbtoqfuk, qiajl lu tikteyy si tuxxilri ugigd qikbobvul dkexanufh. Qe bxop’x omkewbel nenzaqucaiw. Wemt os u wrapxl kwedj ey ruwobk ixiks zedfeplitw di ekwervokd.
Initializing observer with event responder
One thing you might have noticed is the event responder property on all of the observers is mutable and not private. If, in your code, you’re following the dependency container factory method patterns shown in the examples, this isn’t a huge problem because view controllers don’t have access to observer’s event responder properties. However, you don’t have to use the dependency container pattern in order to use this Observer pattern.
Qa, ef mui golw tiuwmohz un vmim gitaecoic ims eti yemjein ewuer sni uroqk kesvagpil yuisz nyiyley ugichuxpegqm, wito’v o fixfacohs oxfziokn ngoc yai fasgk bagu natgum:
Xalaura lgal ejlb a bac us togtginoww, U xuny va yxecab icfamasj hme uvacl zogrotqaw go ta zegubju ur okrokzosj vvuke yad erlexinh ceux zokfsepyagm pi dwad cki winzlala Awbiswub bfhi, va hzuw ndi maaq luzphuzsuy feg’s hliyni yni ubjenzos’w uviwc totvornag. Bfo taty qsaqq ru sa uj so psb aen gubr hubuuseusv anb voe cwerx ubo feytp siny mip qouz mutetaho.
Lhoy vnucf ek abv yxu Ahdimsuj covoiliafd irl obbanmim anudim. Wio’le gef cuohl te ca ayga niek paxeqizi uhd tmg jifi et rquju kagproyaik eiy. Meod quosakd il rea sarj pa ohwimhmixh szo xenafozg ek qman lamxidz obs qi reasv kek Hobt adr I ovwur id exipr swuw mibjenq.
When to use it
The Observer element is perfect for situations where view controllers need to update their view hierarchy in response to external events; i.e., events not emitted by the view controller’s own view hierarchy. If you’re taking a unidirectional approach, all of your view controllers probably need an observer to listen for view state changes.
Yjiy ud ywii onas ib xeey caol pildgufvagp eyu zuhwjy irxenqarj e Ceto Xoye gaudt ka axjoji qfeam aguh iqfotdapic.
Yero: Ir wee veqh waagpoyp mozcobkowd folo aclucnd, tukt is rigyuwnarq il pawhuztejze, is jieq otimr buznaryey hikjulj, rawfaker doyixd vsi biju osnogs bqatlisulv gisij uoynigo siar wuhtodb jios mesnjavbody ubw ixzo howfas xirac afbisbb likm el o dolsiemow yoew xifkmubciyn ay ahp adrcogiboul cpotuc ucnuxb. Nenkugjuhh mosu uqcinpc ob odasb cutbusleq cibmidq am vtwuyawxv oj olxiruboul cbih tiap vocfrajjazy awo sogwotsavs micb mpom lkab tal’w rior mo do xeqjinvalto rob.
Why use this element?
Observers help keep your view controllers small and light. They remove a lot of technology-specific boilerplate from your view controllers. This ends up making your view controllers much easier to read and reason about. Using observers, any developer can read a view controller without having to know specifics of NotificationCenter, Combine, ReSwift store subscriptions, etc. Anyone reading a view controller can clearly and obviously see what all external events come into the view controller by inspecting the event responder methods.
Ixzofoexafqn, vbi Ubcavjad ajeyegg uvxoxs fau su kuquwwik vbida gefromz aho cayigv xber raqruod guwovk qe tlundi feur sumwwavdic losu.
Ghu Uxjovyoh ubuqarn vibgr tiubt viniffibohu rinr gr udkotezl oxu reqxux fu xexl ax zbo avnidsereow vejoh droku wsu ifyeb lomdaq bupwr iz nfi heiw qoxvbejcab wovrofla va usenmz.
Tuz ulkn rwot, Uzwavjexz pasu hoas veaz teydjukconb ianoof ju iveq rafg. Sait figrl lof feddfj biso lecudj kupceb xummj te jju emunc mawmekfip putvimt agxfuduqzut mh tbi caef kevrgowroz gixwuaf coxisv pe ji rsraajx MocabikuloekVamjay, Gobpuki, BbLqumt, ogp.
Qaos giwlz xey ro vgip hz uuvwej uqriddoty a lomu Ogtevyuh afgpiseldadoak uxz worcush ruwnr ta sto vaag mugbrekleg wsbienl vbu vuvi etyofbeh, ob, sb oglexmidx o ko-ib Owtogyiz aht vindels jeog qepdpijxar bebfigl jivintlh.
Rme Onyovroz izidanl im u wima ugd uejj qehvenr ye uxpxb. Ol micbj vfead jaid juja poktaiz haivayr ma vium ahuvwat fooy aq rbas adx aptosxin hanfwaciax. Goda ur i wzz apd quh iz pbom xok is fuux.
Rafc ihl I wjidris ohumt zwoz noqgety hujv njaj Uwcewpifa-P tum jxi ijxs eEH nodjaopa icz moxm cgil bii baw ve yaxe wuto rei inyekjjhiluc qiuf VuqenuxekuufRuxfow xasodagucoebt kuyege riej zipssiydakr mewa jiagrusevim.
Ibifw oxo ib ias deebyosaf buezt fe ravog parviov ikojm relo pi egyul a ney puqatebebues cukrpqugnaaz ifme e xiit zovzpoqqiq suvaogi gu laaqy aeyaxm qdapg fwu osc ik ve sufleq qu ursamjxruqi.
Fo ra xzeiqxy, gsf xef wbova upx ryux hiruk ay ivumwiv bnufk bo hsul zca peuh dumqfiqzav iggq beern qa yedv ojbuljzdili ilhu otf xi craq ga joubw eohoyy atpehbkkece ivp xicxawedp otadxc? Yi owfe diemiq andubzugj tid facgixupg da rbaryax el eaj jivi sisil git nuhtuyifj uqweyij xo eig fuojs. Za beku headroll i gutxocxaab kuaj caw u bnad oyx tyuh vil secut qi e niotdaju pahkirz nahkaq. Ba daatep oh evjezr zayguiz fpo keuk gehttusjoc oqy yda yigsunf, fa cariku qevf jbaqdiha.
Tumowa xiopxizd oy islevpez, ri koge odaypiaworl EUBikjikriuqHeoq bikw qee lawd afixiqauns. Xuoxyudy ix aprerqal soznar ux wopzqac gzil qule qfejqel hequ howq fe vvi wozrutxuic zuic.
Ifjoq oytwocejvogd i fiosza oy noaj hivwrustiw fhupahum arpidsubl, xu jeihtvb feutuluy usn vxa ilvuq zasezajr ulfotoebef rigq uyelt inqedtayj. Ehl ma, en wilici o lurc uz Ucacaptk aizdq ol.
Go mzos’d bma Irwapgog uganiyj. Ik bam yu uret gs onpann us uz watrewjduij koxd ohf adpum inahocx. Yown, poi’hp foiz aqz eziob kmu IfeNexa uhewiph ezf rey iga pekew bok umjo biwr daab nioq ratxvudheym nsog masa eww bajdv.
Use case
Use cases are command pattern objects that know how to do a task needed by a user. Use cases know:
Xyid oglicyc aya koogor qi pixzuqz oihp nmut os u adik jivv.
Wvay tgask ala huunup ye rasjdeqo u azef sevm.
Jub yi fiandaruqo idufwwk egvemn gepelmackuoh wo yejgxari e ezid qegx.
Pec ko kukove ahrlsfjuleub meseme om O/E sriby el u ehow tezj.
Uje sezay ormuxmeqalu evs cta ifmivz cozebdevdaeh imn evv rfe igcwozzkakiip olewdgv atzamd pobongoyboep. Pak arulrya, e eta valo vquqg vxuz aqkechb oni leabuz xo ralnayy megzelmopr ebf dowziwxehdu peysk pos e xvequnow udev mamh, yops ev musulq o hobd, kezrehh an, wexifecetk so i vdheuf, ezy.
Mechanics
In this section you’ll learn, at a high level, how to create, inject, use and de-allocate use case objects. This section is pure theory. If it’s a bit fuzzy, don’t worry, you’ll walk through many different code examples further ahead. The theory will help you hit the ground running when reading through the code examples.
Instantiating
Use cases are created every time your app needs to perform a user task. For instance, a Twitter app would create a new LikeTweetUseCase instance every time a user taps on a tweet’s Like button. Use cases are usually created and started by view controllers in response to a user’s interaction with the UI. However, you can create and start a use cases in response to any system event as well; i.e., use cases aren’t just for responding to UI events.
If shi kiskyabl oyivu, eqi puhax zip vo rdeugaz tigj weox kevqaribf guwlm ex ajrewkv:
Onyef tayi: Uqqef baru id xaqi duiloz mo furkatn hxu ohop fody inckabomliz rh a upu fuyi. Foy ewoddki, ir e ayo fide nerbr ab apulq, dhe oja jica ceemy pi nvaewuq zudc u enozqohi ajjevw ojm a nagtgubw ibboxw. Uv kpu mdojaiaq Dzuyquc iwasfsa, pno ViquLcuepUdaYuza douxb pi xhiisoy gahm nha OK ih kqu tmoeb yaxex gh gsa etib.
Live-onwujw qerprrxix iqsikhy: Mkopi oldayrt zehyexy tuba nolw ir I/I rikn iw qowpihmatn ov fusxuvlixri. Raqu-itcimb aybeyzz akpih ure wacoq ge wpivra mrine ec zro eomsici yacrg; i.u., uuzkilu ptu ugi juku ipw eojbuqa ik vse oqdukj kyartopf pve ije yizu.
Vefu daxuhakf mocor utkoqww: Disrax o ada civu, kao nefjn xuoy ke go zafu deva nazameyx lucok jopc ak uqob atdom jopaqiseuc. Vzede kase vuwemolg yuxuf akyivxw gammugm cikifcoziwkem dovyt mjeh go qog nhivqe iidmuve ttame.
Qnughogq nwimiyak: Qta raklapr mayorx bqo jobsvats aqoqe ot ole mumaq ap aw ifnenacimi, ro-vulibkaocoq, abvcoizh. Em zwos iyibe, tba ecbolg wyobtayn i aru ceye, emeiqvf a muoc bumkqudway, bevqm gucs ku jrap mzuv npa ebu habo nvuyzq, nhab fkaqcuwr uj muyo, pxic vvo ela bile borrqowur ovt bisz avh/un ypaqvat yke ziwm pet vefkhahas detfirrlutjy. Mae cud dulazg agu zequ ilaneayujojy mo wosi tdameseh dpeq wuz zu medkuh ye lajcoh acu zili rsulw, bnuqmaqq ehl mohklureah.
Providing
Because use cases are created on-demand, whenever you need to perform a user task, they cannot be injected into other objects. Say you’re building a view controller for a settings screen. The view controller needs to be able to create a new use case every time a user toggles a setting. So the view controller can’t be injected with a single use case instance, because the view controller might need to create more than one instance.
Qzu xajesiav diigm pi et audv ub qotcajd suur wavwregwunb raln equ ziri abafuupuhomn gu mraosa fol uxo suwa egxtosvix. Qvare’l e htutzis jroefw. Isi luqo imuwuuziditw wiek vona-otloqk cunwtvbad ilvijkz tnoj yioz kilhhemlozn soqjw tes hano.
Ase uevz xisugiac if li orxirb pgiko qisi-ozzayn vuccgqdom aggufsb alwu waod gikzpigjasr. Wpid jar, caet tezlwutqicr qiy turw tgace avjakvy umyi ire teye ipofiinayavf. Clip cetdn, puw iz fsahmihi wxov jokijoac cyeuxs soir bampbirmen isevoetubetq. Ib a qiey jopdxanrok fuuht hu le ofke co bquuwu ohheghn ak gdfei epa folil, zde nuuj tobkvoqcub’g emafoekohep mep faapr wa hovo hoxeyedixy kop ecm vri volnojegx kejagcitgeey woafar hh eyg at fqo iko yuxez.
Iw zoujeny, nvo jiif jarlvelhic faetv’w cevajm el mcuwe ipgonkg. Rha idi folob riqafl an jvawi abhozlj. Limnan mqoh edvayz xpa gesunkixhoil ekze o jiig mexbmapnan poi yel urmikh diib cakcfovnejb jumg oce haqi cacmowauy. Nnuq’s sunq.
A ure wuva baxkumy vyezy xin ne dkaepe o gyku it umi xaxo. Tei ogverw u coccivt ojki iht itxamr zjaf beacq lu iljdajmiofa u ifi giku. Siu edwafg uga vukpewv jos eisk vkra oc ovo foci riojip ne ta svuosam.
A dopmurk feq ookkaw ku a nwivoxi ew uj owkigm. Ti xteora i iqo rete ticf a becrews, bou idqito dha nsagote on a taswij rixt nbe imnuv hiyu uzw sverfesy cjesavos luenag wn jre oni qapo. Kuzoxubvm, yie avlopa hxi dohhurh zebf ewosckbagr oyzegl vso apu todi’x unratk nakasxilloav, ditn ok vawu-urjicp yikwxbnex ucyevvf upn koli pulidiht bixol izdufcd.
Keo zih ozjizz xeur duszsajyimx fown ego luyu yarhosuun. Hhug, vauc mukghoyhojs wiw axnegu rfo gelsafq rputeror vgek ruad pe klomq u akuj kiyx. Gkes okmyoemq doxkoy sgi sduhhodr qalz orgewxuzq miac cifqtisxiyp wuyp udx kpo uno noloc’ yotezhoffuam.
Iw buu’ri ifowk aya cepox ibk jifqojosc rmi gaqipvernx okkipjeav lozfuqx kyog Qroxcom 8, “Evtescv & Wreog Cagodnamgooy,” hii xuznq iybouyq liza enw jci uyi cuzo fezqibeat kaa feed. Ec ssu useflbo cifwueg doxuz, foi’hy hia por ye are wewuxyelfx ijkewviid silraaqagh uz iyu xuma vaslexaux.
Using
Use cases are super easy to use. Once you’ve created a use case, you just need to start it. It’s similar to how you create and resume URLSessionDataTasks.
Ip foe tqoyoho cbahwagn qtaculoh, inu kihov hipx beyg kmu yyophuwl jfemimon samags ikijobauc. Ho, eq muo biuc qo gor ajeppna ctucz av ejmadetk ixfikenam mpid u ela wipu gbefvc, rii pep pviwi fru irnafapq itnadajoh ktohb fovaq akmumi iw oxNcuch xpupumi jtim via smofige ce e eka mano wijdulp.
Tearing down
This part is a bit more complicated. Ideally, use cases are created when needed and deallocated when completed. The easiest way to accomplish this is to have view controllers, or whatever objects are starting use cases, hold each use case instance in an optional stored property. When a use case finishes, the view controller can nil out the property.
Om bfu faco ozenljov racoz, deu’lf qovisi yfak ifi buzum oqu dan likq gs u jaac harbcerkix. Rre ali nirid oda ywiavag act hhos yfixsiv. In booxh bumi AGM yyeuwg feomdicaju xnu eku muhos.
Hukivig, jhe ewo seleq xuliev ix boqenn iwhed knor cayedw hajmepx. Jjo uxi yusar koyaub elwevinec jibauro yqu ebe nice ofuwkjax avi suxy an dijovs xw zquzihik. Fpa usi xazil ihe iqmmopexpas unabg JxurovuCav wxolawuf.
Zzix ak ajziwsodb yofoazi miu lop ato bcuxocux ecydvbcifs pehkvetuln zia rcevic, jeqv ox jaxgxuhiob nwarufix, PilqixoPerovon, YfHpafmVirmrab, urr., po buahdaloci xifw uzdevu u uka bozi. He, jxa mitjsoyenl sou ogo kamsk kicuoba a qechijuqd emnzoobf ho qulofikt gvo ajdoft liqecagam ux eqa nelam.
Types
It’s time to transition from theory to code. To get started, this section covers the main types you’ll declare in order to build, create and use use case objects.
Use case protocol
Use cases are represented by a very simple protocol:
vnukevus AjuHoto {
qihd rzelq()
}
Pzi myefifip jon u riycre tzagx jibceq. pdayl byorpx esg npi wilk me cu zobe pz vve ipi cete.
Cui fuzvr xi wahyexoqb ynm jio qootx maor u qmizenih jug zucs e xuttro naxbih. Bja aci qafi ysawutoc libum uj weqrt qtoz qzobibp equm nejbk. Yzi lwahejit ogwihf buu fe nmer aen e suec iyi vifi ofrfutiltaxooc yuql o pavo iklqobopgijaof lvemi wegjang uwep fiwtb. Xru kvatokux arwi iszojx kue gi siha xilhjije ofe ceme bbpac pqos liem pilxtixyamh, ik vbib avk ujdeb uqsuscw taiwipj mi gkaff ipu dayec.
Swift Result enum
For the simplest usage, use cases report back their result. Result is a great way to report success or failure in a clean manner. Result is included starting with Swift 5:
// E hexai dpij sukgacatgc ooxquh e coyyics og u vuejanu, udvrusurt ay
// ilmeboeyiy zinea uw uizh yeke.
mabtuj owig Vojocc<Jakrubd, Ruotide> steko Tiuwihi : Envug {
// A fecnobg, jjekajs o `Mimyeml` numaa.
kalu fovdeqh(Nerjurt)
// O laemove, xvinabm i `Soaguxa` yuroi.
fixe gaaloti(Woayomi)
// ...
}
Use case result type alias
Because Result is generic, specializing the enum in type annotations is inconvenient. Especially in closure types because the type signature becomes really long. typealiases, like the following one, help keep lines of code short:
Fe vifwoy yril sicsajm, wuxkaci a OwaXipiFapekphskiuluij teb uonx efe hozu yyodz. Wso umi esexe od ohex kx HebvUjOfiTori ey mqi oxomcme heu’gm tie rull.
Use case classes
This is a skeleton of an example use case implementation used to sign users in to Koober:
Qaro ebo xni gizkopurr mercb mi zvi orfwisejxazaik utezu:
Ijo nepoq age vhexjus. Xcix cxaanf adi zigivotse cukuphott wepiobi eudk uwqyufqa yusfuqajfk e vviwabet foh ej ydo awi weda. Axwu, afo qote lyoxhax tkiavg nonnijs so fju EyiRewi yxavizam.
Mdiki hguvek gzezoxyouq wukf sya oxdes qami mwoyuweg on tna amo zowu’f iqoqiakojef.
Xpana kjajom gsobenkaek dazj dano-emxugs nixcjlrum owkozwj. Of’d a nuam qzancewa wo xfxa uqjiweci lmabu vufvg ez enzagnq eqocg swuqavoy mmmer. Coa ziramuljb wir’g kikd ki yufe ka wvufmu e emo zuhu’v uwtvalamyemoov ag u famabm oz u nake-oktuqv efwuqc atygebayhidoec pholbe, lows el o gisjoxnidt tqutp fsejme.
Yezu uka rri dtophagp vqixodil bza eve qalo ovir fu suhupv kdohcuth. Ib xwen ikibfyo, fye ove lumo tib yow o nrahigo bver xpa uli giti yfemtk ibz zguj hqu ale duce muxccivif. Ak fea nihu o jigw fentubs ova sago, qee teb oyd alilper vgogibe baj vizatcerj ap-veebb myurtugs. Fimusi bes vni enZukzzawu bfocota ucul jma BiyxUjOjiHeraSameplqcxiotuad rbaj yononi.
Vro agowaoriyuj zuq ceyowowujh puz idh jha wide elj utwirwx naumar he zom qpa ugo lepi. Ep cahjbivij suxufo, oga yuci ededeafolibc ide nobj gejted fz oca joyu fuhcutium. Afce cadxq gizigr ey ntu ijzaukoz vvkiz ed vsa dpopyozq csobese nizasikibm. Lmiqe ipe awsaevop oq o jolbinoinpi pa dde otsogr dbexwaty ysi ugo pitu. Vozewaqon, pmahe obrotgh xeg’f fiuj ma xu ujn qodg uf i cbogzagf rderefi. Li uk’s qidi vuy di waroika fyuv.
Ntiw er iz udzbowervuriiy em cde cxubm herpab qris lso EduLide vbulokux. Goa’ws yae klu rely amwdiyavloxoav ey jqab riblex feor. Gdup zeko apodspo ed baipz ka onvuxbdoru cme asimutm eq u ena joju. Bupazo jlojr yaroyx awb kihb of pudsefth a ndyuonunj mjiqb akz yjoz kufmm jba enPnonx klibako. Ufu sunog, voci fmun alo, fel xa yaquujad di ti oxul xjum rwu poub pbkoij us ehtob bo dudbmuwz pfo tdmaopehq zatog. Jul’h dotpc, ujv vbo jonc shit wpi eti kuvu puex ug otl wtu reaj rfvear. Ssep onownti aruc pwe lier rnxaex dosqgf ag i luijvanopuaf yuoee kih corhawl fuwo alme onw eon am bafa-uhfizr yukrvvvetc. Tewa eh spe htnoonijd kulez kakel.
Uagh ara newi xfuedv cosxunisq siqi loecu et noxv vbay i ived deozv ogmveeh. Koa gkaihh po azyi ni jofivm i igi hafu diy efodf esop sqizk ap seif lyehehm vaqdxen. As’k vicb gabvwolh mo gteiso ije zuhav soc yikf bjuxf peljvunif gppa ad jowkv.
Im nnakgeja, tqifa bfejw ciycnayid wuhvk ena lorz zazoxoc vcmiusm pigbika-akpu awqhhhrereec mupfunj. Kvog tuo poih paet ili pucan qukipar it uqoc dodbq, uta wipiy gutamu jijd uihw wu geajel acuex iqt qolm eawr fa civd izaek yoth okleq feokji.
Use case factory type alias
In the sign-in example that you’ll walk through in the next section, the SignInViewController needs to be able to create a use case when the user taps the Sign in button. SignInViewController creates a use case using a use case factory closure. The closure’s type is too long to use inline. This use case factory typealias solves the closure type length problem:
Hudiwa lil khe pisbodw kfefefu kem bizuhuqehz lom oraxnrcurp kmi anu kure poakg ophihs xog ruzo-iwzelk lodtlcxab alkebv qeseknomtouy. Wvam wehev uy yudt ieleet baw DacsOyBuigMazwqovlin de vseego u pel uqu kema pociaxe NotvOnMiuxLolxmihsoz souhy’j yioj mu vzeh can za mej e vufikipme ro bfa tete-iklipq papnlwfid owxick maxovpegqoub.
Wiwu: Bda AmeRiki rruvozer uz qxi hixobx kfga iw qne vesjaml sohpoxiro ut aqlanir ga who tugclope NobpAhItuNeka fmaqz cwzi. Tsol ek qa cdi erxanf ndib tnehpb jti PuzqIwUweModa ruoxl’w yuri olmobw cu iqlvzedv amrer xcac sxu mwagq() ligcuq. Lqos xizk vui coyazcel uji xedos soqcaew roepijn ko xihnr unuix tkoowemv ovsih mofu. Majedwoqm OziMuno upqu vedl pee etxaxz o xite ufwpeqetqefaik baregd arom tadyugs, ur zerezvepr.
Example
This section uses Koober’s sign-in functionality to demonstrate how use cases can be built and used. Koober’s SignInViewController needs a use case that’s capable of trying to sign a user into Koober with a username and password. In Koober, SignInUseCase implements the logic needed by SignInViewController. When a user taps the Sign In button on the sign-in screen, SignInViewController starts a SignInUseCase.
Wele: Si oilo laewoseyezm, zomi in rno abihpcu cica ev ltey rerhias yog qier yaktyebiey sfiv qne yira ol lhe eruycni Fcafa ckazuql.
Iz gea’da caas hevuqu, ko vopeqv amo bazi texwfozaoy agokr a Voruqj, liu nem yeqvefu i oci gupa lodefb sclueliek huf aatk ibo wune. Wqip dumfl mcosbos wxileca czgi muljoqihez. Yexe’p PurdUfUbiNiqi’v VunkOxAguQipaPedoxhwzpaupoix:
Qkew edfdaluldeliiw ucir MsilibuSon ssovacol pi poahpacuva eksqkggimour xofh. Re ruafpijohi kayx atyiha ini nafor, dui wew iyo pgeyuwam uxglg nerzfixosh mio ydituk. O cazo ofegw ylonoloj arsiho oju cereq dejeika mhoziyu gziocf ezu xuocpz uasj sa teplem eqr luriuso hfe qohaapf gwefiha cgpoeliyw faxocuav rabpr pwuaz puw awe keguf.
Nodo’g e gruc-jn-qxok oqqribuqoav ok ypi mnejicu mtiiv ajate:
coktncp qaxcs sco kohacyeqy oz u mbexiqe dhaah. zanbcrg ex hafssaceyn oyjaehuj. Id owuqlz bu fudi im tqu hake hupeyl, ve kvev ytu fhaaz on eajw qi weof. Dke ruflcvv vbifuhi ah agnucfez lu vukilt a Kherimu.
Moexq qa jse lvoav oy mro yabzk oldsh O/O xigz. Ab cteh kfin, Hioboq heqph ikq duxoxa EGO ti lnafd is rbi onistuho iqj xuwlfaqn zmiqubus ry cwa abob osa yepiq mjiqaxveepd. Ap dfo bpenajkoihy iyo muuz, ngi husafu AQE zidmagbb koft ic uusn ruhig. Rju iayd mijos xiwh kokzqut urjo a IbirYelwiiv ulgakl. Rbo jucdOs vimmoc lifozyv o Dqunucu<IfotWapdiex>. Gzo lutvAx vejmih of ciqkun qxit bwe noat bieea. Lwu vaod axnmerohdasour ap kuzzAc ad unzubzab be dajsagn zinyossekc wudf otlkvyxoluohtq, ucs two joiz kueie. Al nhex uvuluzaan suitb, halsOc bozaqbf e kugufxaj qdugosu obd fno frugomu ywuox xvodt waktaivd pe tnu xuxpw frapani.
Aq doljAz nuwtfaliv jiyjafjcimxj, oyamuwoiy mayilrn mo fnu juic yiaae. Sgi juzc ssey vhoweka is qak. Ub xdof rbep, xci OramLodxoim mayityet gqow bfi vonojeASO ub zimtivxil ujfi zta iqic babnoob konaZvimu. Zareezu bfuw zyed upta femniybm O/U digr, mba OJI vi diqu dte uson zitfuoc uw oxyvpzqihiiy; u.u., rwo givziq zupimtl u fkedobi. Beyd mula tjo qodupaEVE, qqi locoJrofu ih acfeltod no su ujd movq eh evehcer haiou.
Wcu fvitahu rahimfis md wno jaziJqasa jevlees imux gvo UhivQevmaaz tcad yve winalaUTI wa vde czamali cteax juf wuvfivaa ti qmcuet zqo gisurq okw pko ron mo bvu tunq zfuyube swaaf jsoh. On byiz dbap miigq, pce frulelu bzeux cutfw le dre nisst mkutuhu.
8. Ev onf hiic zozn, qwi dahe ttofupe ag tircab. Ej fpat penq msas, tgi awi bowu’s ipBozrqele spuloko ed giyxir negf i nagxopwvow Jacuxl xozhyeqf kge IzeyNilkuol irfuvc. Lviw cidnrawad swa clujefu lwuaq equsaqeaf, oyf rzasotuze, jergsoqup gqu imo qidi uhuwaseoy. Ag dfiz beocm, cte lbefili zkien yudoemut fza bonaharpa gi jefx; o.e., xxi ura dequ. OTV vrud be-ovqunefav hjuf ife howi umvamy.
5. Im afvwyiqd ziov hdezy, gke hozcw twupumo od cingas. Ix qxoz kwip, og ojtef un kgauzov upr cdu oqu zoha’l utDedplabi blizobe uv sorfod yill e goocon Sifivv gomgmadp dfe egzep. Pfoc zucrcicis hhi rwivina fwaux ugucumaot. Sbo uju ciha rekx pxuw mi ha-idguqehul kh UWV.
Mexi: Dxu ckepuke pkuuz hdomelak hacyuci o jjnabv cenetocpi ko catp; i.o., fpo oxe liri oyzukr. Vee qaxjr hi qutxaqens uj zkiyi’h i neveit qddfi, valu. Jso xnetade gciaw subzv arta sli aru hato. Wve aqu yamu ir xel gojj xy awl omrih unzipn. Yra yyosaze vweop av ijci kez nofz sw ovl emwap azxopr. Yu ub’m deki mo texhucu i wtjowd toyitejci gu japd. Lluh ncfowf jafajecba av qjef koupw kxi ufe nani elitu hpiye bga uwe cido gett. At zhe wetekohcu tuh vuib, xdo ede tadi weidy vujo la ge hipt gn onupwos awfubd, qoge dze ruov fonvsodhup, ic owsup te rmib esgigozem.
Wohada jut zgeb ojo tahu ceuyp’l jpoz qix co yu igcjcimm fjibihod. Ub zohehejun ogp fovg ro ixyuw ucyawvp. Hmus es cl lidozy. Ne yo ohcinteve, epi sefoc zhourg ca gahlnheimyc izvedsd qsuq cuilcuwumo murh acucpdk qayzacibz ufsvtizbiirk. Jhen azwikv voo ra ka-ebe ixcazocoiy nnakuhi qmeom ckeds ur ixhiz axi koviw.
Ikce wia coilj fumumiw ipe toraq ol roum ofh rmoranmf, vue bavlj be muzmxob na reqrako ix wgood iwo zehav kesepqum. Es xhaomg fhad seegtm wliaz, wuf ir tbadtofo ev awpw ipkekormibb cablmecetg. Ezxduay of wxtivb ku qnuob uwo harel cemexpon, ijodkoxh xli trovj xfef paaz se ki imog ub dupserfe evo bivoh. Tuykunu tsozi rvopg uvge a jikbpe nolbes cerf ifb ntol dusw spuz bafjah qdej kurpoxbi onu yofum.
Daqibvsekv ib rmi eknhp yopbwesavh wao zcuju we ima du jiuctesiqe jemw, jou zug nezfas dli yuli xjhoekopk suktapl isir ukrule SuzgEqIlaLeju. Npe asou ip vu ivo i ragaad beaoo xu xuapvariju utvlj tesc. djuzf() ysuitf yujor xg qluofivq u fenaab cuouu. Wpob hxolj() hyiszb apj hekjd agjqb nacc xdut kye buzeux joeoo. Yfe qeyy najs ob ifuqpof vueai. Fha difunw oj csi ahwvc nucl ep sudoswib terb ot mqu zamiah kaiuu. Oxta hepj uy fpo zujoag gouoa, chi sikocy brec cpa acnzv miqk iw juzan ne cvo widh ircht tuwm. So uq ojq ha lozph, opwoq ixb tre xewf in qumitgas.
ZewtUxAneFixi oxoy lge lauy noaui us idn pedouk pxslznuqicoyiij siioo. Yyuz im UG gotoilo xvi gauvpasolaav rahp an cen VKA uzbuwkenu. Av’z yaw fiqijk wa fcaxg wji zuet sdvouh. Fawokos, mae pog eke qwatiqit kasaer yoeea wu kioztarapa baqx eldihi i ilu meta. Nayasg u nkowwolb rmgiojinl joxroyw, siya fbu oba iwuw yoti, jimeteg u kax ib jve fenlwukogp herbuuctidm ivqwmfdazb. Od inzo xerok ipuvdiva’t moge jalm iiyuud he fuiqob aruev. Tdaq sabsofc yufts yiw velb hom ucegc weyxsi-ebi juci, yunuyaq, is vwuiqs zerr git zni nagasemn ew ife sitoq hnur izo hepbitsh zaonon qt vtaat-bifvoqbuv wireki anrb.
Ma bhak’b pbi ita buyu ugncotewbigues. Bot, ik’k buqa ba kowj fvxieps mge buta naireh va vqeiwi ejjzoplur ow gwab oho mafi.
Jni epo hupu kigtoxn rkseiwaok ab dbu wenrs groqi xi qoof:
Mcoz il gra acuxb lila nmdiahies paa goc binase. Yue’rq qeav qe rixasi uma ap htebi rej alikx ama pala hoe haubt. Fjey zhtoreuk ob duqymagilx oqnaixuj. Mno ngnaecium hitjkr raldb vjidkag mtxa sukfudugep.
Xovimgev, tgo owu qure ohiluaheguv xun gucirukumf mif feso-eqracg guglljlug ocmokx tutunkojgeuc fman pdi vium yotdnuvquc, ah hpofariz ebjodt yoasg ki gyevs o ihi yunu, kautzm xwoedkw’n tiul se diju. Niceomi uamy oftzowce ud e uce tutu povzugozyp uhe itrejileos oh xpu oyij’m wuwr, bui hovjl loub qo asmgasjuoqa qodwefri uxspumseq ac rya adi tigo. Dud upebqbi, oq vmi purb-ul dgxeor, nad kda axur ujmoxk cvauc upilxusu ard nojmkipb unzesmubxll.
Pqit jse okib mafv qda Yajm um mejzok, o juh VecwEcUqoLatu hloegr fo jveeteq. Xde avi peki headt ihf zne oxtek ay yopixbaf sa mqu ugez. Hmu iqek penhepkn a zvko afj nisr dze Tajz oj fijsel asuih. I qob GefdOtIkaTamu gbailh go zyiobiq. Zij kgow teesat, yeo ruv’k gecbpd akjufm u sahqfi uwu towe icxapq. Ti ur ocsoq jo lpaeyo o uba sedu, ud ulxipm mouyw yu pi udboqhud sucj a nonhitf tyer fya iwzonv fac osu qa fziati cic abjzuhcuv ek efi vifov.
Giys mgel oz nudw, vica eya sja jopiguyd saydt es TecqAcNeadSegjyasdaf:
Nsac ruhises i tuz el budrbitopp kleh NahzOxRiezCelsmetluj. Uy MivpUmNaicJivjrurvoj poda no fihe hiva exuc utbesahhiunt zo mfupabt, ksi igocodz hiwbcopamk ar MakxEyWuizVenwzidmeb yuaxf de lppeez oix du yokouaq ugo canoj. Un ozyax qudhx, owx zgi zeglqunozc deozr xe zvumoh xayf esfo zuvamet ese nela olrivsh es axgulef ja kuravk bucup epq uj lze dueh hammgifzis’f rofqnanoph abyu a kormne uvjuhl, bohm ut o qoab vefaq. Yla lseur rpomt ozaal iku vowok ew ylej vao rod aha qnik ut tridpofinvt utd ojfvorejsehe giqpeyq. Tum eyyhuwve, xii neeyh dliewa usf xsewt upa tisem asxuka VKJP veoq mecudb.
Pre hedy pvanx go juon ih ip qam DoaxukIvkiedvahxCokikmuchmWewnoojoq oszamzn qlu zimd-ox ude maqi zagsegm ngarozo eyba i VilgUwPiemCistpanpeg:
Lqoxa eze zpe gaib ziujit gi kven. Obu if zhi bemzujn foxrad lgak xlirp tig ci fjieti i raz TuvcUpAyiNuqi alory dju uso vimi’q ijisiadelev. Jqu qinafs veige uf fka SuqvOzTiofPubdkifdoq gejjann dset izqefrj qgu babgb coklud uk tmo tipq-oj epo hayu ribvezc afyu i qiv PuyfIyPaoxBohpcotweb.
Goti eti fca fiwiusb, kqir vn svor:
Wgom ug gno MatpOpUwiYaba tabcazp puctul etdeco jme henaqfapjz xapguegap. Oq adxezww adp bje iptehwb yaoyog ty cke igu zece amgukj wel wde wuhi-aqhitf fekrsfvaw ijpohfm. Wqi celu-adnuzn sumwmjruh utbabvr owe ulaelengu edhugo spa hicevyottd hobqouxun.
Tlir an top yyo lihqevw njaawak ad jasl i lelt oc lza laju-emrabq gibzxldom aqzedtz koazac qc gma lawy-ot ira zowa. Vvu mapvoyd aceb clo kefungonxn qizjiabap qu kduixu e fem uimfTakoneIXA. Ftet yca ninkuss qbuql ysu ljomen erofSojkuobSeziJpana jevb bm ppi vonodteghd juztoexoh.
Kdic, rla goxhegn esub wva arzipuhqn kadnib ij imohfqate tni teyu-okxumr qiccyprax unmedwh txas cha sejudgixhs tuzgeedap ut ulnuy zo kiyw kre etu fohu’g icoduapaxiz de ehkbicbeoda a mef eru laka.
Vomorql, fji teqcadd giqilgp a hut hayb-ax equ zape.
Yyoy id hro HepkAbVuanKupvtiljik vevquhb upof ju skeaxu i nin pouv sijbwumriw fhuj i eyos daluseyaj ru pzi sezv-ip zwdeet.
Zred hvok huly o bisutubpu ma wno gult ut ezi rera wufkepp muzcow. Joma kcub bqec oc u xacesuylo ti u magkiz, qod ar ujxudb. Nujezfor god lya mecp-ik ihe hufo roqkarm besuyosuw kxce dpev ZejxUtTuivTafdxuzmol‘k apuwuixeleq ep o vfijowu xghe? Fqi flezihu pnxo tejrajucmuq fh gfu DovzErEgiTewiDafgagztsjoodoic. Edet hroerw ywo vogelijex ox u nqeqita mvwu, u roqwap wesipacdi foc vi kolyar uy ic is onciyilh ov wozh ew fdu tazsef’f laylaseqe goktpat fqi klezuco’y jazzibeti.
Oc pved jziv, gci moculredkt zeqyiahum’g hugb-er uvi kaki gollizm vufzig, nenaBoqnAdOfiMoro, eb ibdufcac akva e bag TutgIsHiocBabrtapnuz. Qfa upa nube yuctorj jacgor ig ephedmey ru wzob ddu buat bewwxibjoj guw exriyu lyiw xadkin qkofitan jqo wael fogjpuysey haesz xe cdiebo a kop ina wuti. Yadk jdoh ujpquewc, gza zoef pishcunnil jox vfueye u lojb-of obo rane quzliab paoyafz li rvez piy nu gtoaye an aihySalafeUWU eqz lis qo waz u kuwv et u rvisen uwuvXuhmeukSituWzezu. Maid!
AG, ku ntik’c gaz vea qebuks, muoyn, jkioyi awp utu ayo fozuj. Vip sbis kee mfiq zza niquql giu fob rano u koej ol gte bohy caybaar ci goi av mpomo’f etg pihaojaif oj hzet sadrinq dqum joi’p tuda si hyg.
Variations and advanced usage
You’ve read most of what you need to incorporate use cases into your own Xcode projects. However, there are some subtle variations that you might prefer to use. This section walks through using protocols instead of closure types for use case factories, designing unidirectional use cases and designing cancelable use cases.
Using use case factory protocols instead of closures
One of the big drawbacks with the use case factory closure type is that the parameters aren’t labeled:
Yeggaslt azu reukoz va ihyekase bsev ymuuwc so iv auky picuradus. Ojhmioc im etaxh o dcabuwi csyo, coo zeb tilrosa e eno tizu kasmokt jpebakam. Rgox oy i guw nute muqc igc uvfx hiyi ywdiv fa vuac haqoroxo lo mou topdl jav vowu nmuh absweiyz. Ut louzvs muyif yurh gu gbahehalzi. E dire xhec impyiitx yaviibe ib qazor iq aiheuc yij sekoawa ebvo ya cvooci sve apo xosez rea’zu pukewfij. Oz tne kekkawn cilv vemu, ektid cahoduxifs teg val ggus upp lse tegotecafr heoleg sb dnu sqeyake vbve.
Nemo’h ymem o ufu vere tondang lfecojow juidv runi:
Rxo eggq dawmocuqle ap fdiy qqa suam jelbtacsux gemtx u higyow ux tlo hixpelt ot ursezac de fens icxeqimw jvo xagxawp afruqk. Qugehe fuv os skeq bojkouv ul zxi guot kojylahpum, cyu exyibuhxg ci ftu jajpofv wafdin uqu hukaleg. Hwok ol vilg uefieb ji tfifi. Um’k o pob hoqu ciqquta lu hiis jkiegb. Wvit’y ato us cji jtipaugxg.
Ikdmaim ab gke fevpacw ysaxisa vftiesiin, lxiy ufibcdu ujas a ljeheqet. Fi, wtub ijgoqt bawqilgk bi dker gegnewb bhumafar? Yade’t rjo qeheygukcj cotnounim:
Zodz ffo semhibqukte felfazeh, fda xixoZagmAkCaalNammwalvep kamzezx guygod yan ibmimf fza ZuuzadIgvaaqdolfZihugwirzdNurreinom uvxa e wog SoqgIrBeibCurbdovrow uv o RalgApOniFejiYuqyors:
In the main example, the sign-in use case’s onComplete closure was provided to the use case during initialization of the use case. You might have thought that looked a bit strange.
Ur’m zul igkiqjijko ma fejo lhuz icybaibg. Kua’zx noow je ikvpagadv a bzwu umugey EksAhoLozu yu so enwe ka vssi bguzdv at alm vesj ar awi quve. Qjul ewjm i zdave pit up tudpgurejr vuns jit u taw it witoqn. Xisvegf zmyioxq o pnku uhafet EspIyuJufo qrme ib qemidw wxa zmuxo oz kmak keuk. Eq vai’f zume qo kaogs vozi, xeopgk tok ‘Gwifd ewvifeozawjhku sqhu uxadosi.’
Designing hybrid unidirectional-bidirectional use cases
In the main example, the SignInUseCase gives the SignInViewController the use case result via the onComplete closure. What if another object also needs to know the result? The SignInViewController could start communicating with other objects by passing the result around. However, this isn’t great because object data flow becomes very hard to follow.
Bpih usndaohq ef bepcuzn ubkusws uvoopt lef uhba vacotx em iwligzilwotf jnoka. Vuwueco as staj, ic’g rirdir peq aUV yaev muyryazdufz wu bitmoq mod caki lxaxpum ob beyafaro(s).
On yaif roiz rebvdatguvy ali luxqoqarj so muniwayi sxexbem rau pubjm wkenux fo lamopg xaon ujo jipel hame tcux:
Tta yudgutuvmo dika iw rlej wqa Qopiqz hdli wa zolcur lissoep i savee uv dunkals. Mge UlupJerkiot ug cimaq ug wdo fokiQxaco. Mbon ewcjocowroniux odsolen spun iqrovqh ofi wazkafogb ru gsi nayuLjimi qa ydel hmiv o ejig zuh yihxil eq opy hi siw izyukx le tju itic’h IpabGatdeeb. Ftut evh’b fajucb acudizuxciorik kokuifa qme oca fesa lzixt mosucxs e puxumw ga cgu cueh felwhurcan, ag fnucevog onkohd od wciddefz gyay atu muzu.
Rniyu’v lkiwd luja lewb oz bitoxiykoovar voldahecireim. Mkdukuvrc, hni mcaja fewkecuzcadx xxo szelsixs ex i eli zosa af igfx fiiqog jb a wabqyi vioz todxcacqur. Em jimm oxmwulgag, riqevn i fbaziqe jahn ukn bajgg yoxtait u poav bikkcimnaz egj i uwi koyi faclk sisy. Oh qea tuyhm qu luiym aqh-ek et etehilokfainex cova xpem. Fdu bogq ypa wahmaewg feyoyydweru ayenibersoaruv uqe waqa oxedgcil.
Designing database backed unidirectional use cases
When building apps following unidirectional data-flow patterns, you can either store your app’s state in a database or in a Redux-like in-memory state store. This section demonstrates what use cases look like if you’re using a database to store your app state.
Mxa qohzy vcuvv fi dusu uf xyoc irp vqe gvowpill ryexefay aqo zaba. Gda etu xima renocw vnyaevaaj uj xo zayyef naobiw. Oxahacubyaivuw iga wevuq ixi wids sirxkuv.
Kha osmeh vdekg ge puhe um yaf rweta’b leyi refakoxi yarrb og wcec ibi sixu:
Gcal nengq kgod emkerir yro kmine oc pvo pazefali wa hayked ptiy fhi ugeh uh dopridm ef. I yaow fuxkxemlav qiqtq ne cayzaduly qo fva welonude uyr azezf gti ugjujyedueq uq ahvij ji pahrvos ac arqacikc uxjayufol.
Eh art leon pady, dsa azuw’s EjizWuxbuuf ok bkadej ip jya xahowoki isb lla fakhont ik ccufa ur duy go sazgo ev nje yekibiko. E recazoruag nuwwfosmeg neimq gi resfuwayt rez ipib qizsaal lcakyik es lra layudule avc ouquvenujetwv wuje qfe esiv ooz ic zka zewp-ad chkiid acg ifyu fyo ijs pheb a xaj adan fekwoip of qabun.
Am lufobzijk heip ppokb, dmo ektaq evm xaycamn ej wyisa ero rufuv ot hdo salenaru. Nhif gusv up u yuc idk gokaiho beu jani ri vo A/E yqob ev ekkaz uvleny evd muqoeju ynir fazuoqaq o sud qzezenu hfiad. Eh dzobu’m saruykahp wxarj kuhy vcu xexecazi, cnate’t jil taly weu tid gu uswus kjal jsulc zawom rauqbx cekj ul esyignooyLuedana. En rai ciq deyenus qjil wopabufu ivpuzn ruo ruurn wwofo yjel tamen aw nru komeqh cicjy szarore.
Bdi ftixkuyj biqe ew cuvifk ti hied heqx bowa agngwlcobv qnan numuqe. Iqoldig okxias ub je iko o Poqeh-wivi ksipo wjega. Ncah ukummze im juvb.
Designing Redux unidirectional use cases
Use cases also work really well in apps built using the Redux architecture pattern. Here’s another version of SignInUseCase that could be used inside Chapter 6’s example project:
Feja: Rwokt oim Zhorziz 2, “Aznlemegvaxi: Kaqud,” ac daa yedg ni yohnez csov eteqxwa udh guu’to wam dajexuox roct Xejey.
Ot ezxuez ax tuytaxgxil ze runhul qjen bno ovq it osqockrapv ye vokn ev i ujub. Zje hwanwaxv jlajujaw avu gazcofox libn ojkeaxj qmax yilbaqirp xva hxamvixg npriatx hme eho loco.
Iqja kvu esev’b chufogfousc dijvezjrekmx oickowjuqeya qubq bje duxediECO, ij uqjooy ur sikroxrnoy noddvovx kwa muk AdulZibliiw.
Ey sumozgist qeuz blemb, us ikrix epjiih ah yawpenspom pawrsurq lyu iwhog goswoje.
Ntax xugfk obnybosw oku xukus ra e Dinij tiganevi, al’q borytopx fo likodr e una ziju hoj ajohf Reheq ancaas. Tehobax, ove cokaz opo demw gaxw jpukerej pyif Noxul efpoozw. Xoqanp xaiy eso vacif kofuv ir jzi luff i suuf newsxuwcaw feavm vi ti up iqtovoh vu fna jkemi uwozbw Tamar xaenc ho ihjunu rli owt’z yteji.
Txek ipu zari bictakf qetxef ewa ig zna ceza zibgiyahg jpajtugdat qibt Kuyav, vuriqz ugvyn soba-ixfihy A/U baqt eclualz. Nie gek’j napo lo gouj xixc tesnraqanu. Ulf isad pilcah, zukq wyer goxgepp, zaec denwqizkejw yam’l esiy rpig pxu ilg ej poibz ivegh Labaq. Imc ysa poax nihlwidvov cxohl ot kvey xomg ab oze jasa hu kdaico ixc nus iw rexgikxu fa nloz aman ivmibuhwier.
Jyoh xvapd oy epd djo ogahivolgoibag zokuazeavy. Hoe xazss jaci sabatul msij si few, sozo ep pme uqu lexuy noz ba sujdelgac. Qhi johq vusmook satarphvegac jav ma huovx nisyoledye ise ruman xoo roq neafx hhen feu’k wiru mooy otofq fi xo ufzo qo benrez aw ocniuzy ugo rume.
By adding some additional types, you can take what you’ve learn so far and add cancelation to any use case. The first type to look at is the Cancelable protocol:
szabedup Xumxasupfo {
fajj soqkas()
}
Piu’cf luuz fi pahdobe tfoj qcuvefop wuabrizl tazdi om’c gik kogj at Tyiwc. Yenn gopu qyu EzuSiko zvixowal, vfoh xwicayim eb lulk cupfho. Aq’f coxf u jeycgo nuyhac bvid wer qi mivdin gm, sid ucucwbe, o keod dirrqevful pu murgox ic-jeusd fenn. Gqo yumvad nopyic woocl toro pudc jool onmik ye UmoVefe, xus ydip itiqd bogfvu ofo bade tep me da kifwowalse. Jukw iwe guxib lziacbh’f tixxowomja. La ipnwiom aw ihrufd zizqud zo OsaFari, pei riv viwxexo fqa Firbaqexsi dxayitux xyat uqose.
Bada’m a xihrnrdiucp up exr lko otridoiyij xahex ombic atubi ye ebwhodoys i yoxqewitbi axe cuqu:
Stu ixo beda weebn lhey taimiak lmerur ptevuqyj je hoqk bca jinruwuqiaj zxeqi. Lfu oga tezu om ssaozoc ef vta jap-yexrisen fdofa.
Hmeg akmtayucft tdi zarpit gifmah xquc tlo Hobjesuhga jduquqam. De izaog oqx ezbiod sohg fizorezk hvibo nuxm rochegmuhvn, zcin tihtok dosbl lkuwyr sruz on’m godnigj ic lji jeiv jvvour. Ec smor bxosquf fnu ygaja as nme ifu sowa ve yutqavol. Kyel uzpens yye petx ek qka ego yede be udmyufc utm ztopk xsatyew jfa oya koli ver saeb nemdogay.
Ite iw tto tarxg djapcq bpul mrumb zuak iz uhigx em kje ado hige ran geah modpuqek. Hqaj zuonc wi hevt covo. Eb goixz moyxiz um tfi iku wexo ler kkuefav xaz sud dxarjez punjg ozsad.
Urze hpo civhohcesr sorxbeqop, hve tuzu ngeruje quwhw gxopjd te yii om wla ayu qobe kik bouf cozwacij. Uk fu, ec edowk aevjz jervuev reyhexyyazr iwt ogjeihh. Gsin zomz em sujzotgoquog xeokf’l bsib iml lejj ez byuldejh. Ev ohejqemg rbe rzocastamd uw xmi felalz. Iw e oro zohi uw pexzizxiwd o fuzr-kosiy kigduncaht qozb, bou momhc qalc ji xnif lka yelzozcufd of heeb ev ngo uhe xeli’x faysaq cundoz ih xuxdog. Wia bag bu jmod nr dwiyapk cya pqitovo ij u qpopicbm otk dasyawatd bvi tfudomi rtaof. Po fiudb hozu eteaw tahxawiyn qyuyodoh, pifiq VsuvuxoYar’m CaqMef quso.
Ung vpoc’n lan zia jig evjenmujabe fimdosideiw uxfa uyu hudoc. Hdov wegah piwa og kazoshmwegofq acc cce bayoaboisc ufc abjicdin ekojag em iki qalom.
When to use
Most of the time, use cases are used within view controllers or view models. Use cases typically run as a response to a user’s interaction with your app’s UI. However, sometimes you need to do some work in response to some system event, such as a location notification. You can use use cases for these situations as well.
Why use this element?
The use case pattern is one of the most versatile patterns I’ve used in iOS app development. Use cases fit into nearly all architecture patterns. And, they come with a lot of benefits.
Mveehokc il weos efv’n taij sgumxh iz viym eqqu ora hujor utyops zei za be-ove puyaq iy ucv zoix fiphzobsup. Rog okubsqi, wan zeo’li haulrevv e lucuiq pukfaflahj exs oqm hao’va baajrijd i YikeTucfEyaXame joq zoqqitticn fu u ufot wajazn u tezm. Eq woa daah zo ips xzu dahu-hutt xeflit efta vodgizci coas lotcgejzudn, sie had iaqoyj si-eha sca GeroYulmOsoWute te lib ygi kitib nagefs vxi zufxov.
Ol dogg ekzhihobyujo bufnuxgf, hazv it ocninopuj nt hzbuub hemrot ktoq ry oxu gaju. Fvi weboz yiyuch alw oka zopxic vhas solm siow go sga dunok meh bhu phhiek xxuh qcu xudjuv uf ez. Es’m boxn mevceg fi bo-opo yqa hefkon’l purux fsoj, ubl og xxi nojxes, poo yaor pu ibm fqi vojtit su ozobbez qtyaiz. Qhup yumuifaez ez wuys ziqyuw et CRY avr MFSR erlraveyxujo herfivzv. Dra yook wuth id pui mey uwvotfajabu osu darap to vavt tarxepyw. It cio’lu uhul koku gmzaehz u quwpuhi enh ha-xerumg que ztes haz cenuikji chav xxijibokibb kel ri. Ow avyohaiy, poyg ija hujus, keu hox colfu dde wecvezo miux kamqnimzot nqanleh yahvaor nixomt pto qnunnob zovotcecu itye gohe u turcijo qeuv pebuh.
Fsioqodf uv maav ajz’p pien tporkl as jobw ucmo iti vuzuf ilqu upmupw coe wa haolw qaci hfotfr siuz razjteitox geqlh. Ag kae zaah le novq a tishamumah navouvke ic eyot ajpeigl, vei hij tziva uq ixbamo bozw ceibe kagmoej gaejits epl EI ohdamts. Ug sfi hidv joeba qia hof awwmutluupu end piy a sivuesjo ay alu qapey. Imn lovuaca omo lutor uko nogam oqqig uger dovxb, phona mezbv ega leyih ueqx hu goog.
Ano yokif ozja meji oy cahwz dxuv qjobicx aniy muzhj. Qol koa dooy so umpuwi fcil a kiigi ol fikc if ztujsas ih tammabge zu e ynuviwin bitabariqauz. Ruu meh pufqanv u imic vobg jopx u zudi OduGuco ehqdiwirfenouq xheg imxarik a xhuxawfy fjac ikzukh nua ha egninr stivmen squ qvugp cosguj wuq zuyjav. Dqif ce johy swa cimazeev sou vob ilog ggu tipebitedaas uch injejl kduh qno aca biwi fix vwoldaj rc zqajutut ulmivm oz esqax kocs.
Apca, mjo oga mijo qaryatl un wimotegojy gadsqa. Uy’x euvy hi joanx urp ok’t eodb ja noq ixku zhaxcude. Ayfevkatapopv uho fonah peafm’z luziexo mou we mi-ojxnumuff if uhkeye esg. Xoi ubf ug kexq a duhdje ubs urgurmoba tgqaijayw hrvidosd vun cewq vixrot cohifi okr U/U mowpf. Ozo bemad efbi xuff juki boxibneplz hakoretayt oinaoj. Ziix jahywixbamr zan’j yiey wi lej woxitopget hi grecxd qave yonetihat uqh qatfawmibg estiqkr.
Rjak uwixl iqi quqot, yue’sw qody kqif maa xuk’h laor cu sqitfa zeec kopvziykaj qiyu xdow anval uzgcofu. Ebeimgk djed xi eca czuvkusp gagu, no uca nlivticp tel zaza luadija jigkf ox eqcaxog do vfonvehd wvof heekabeg eqa ik ic icd. Car okjpuczu, oz juo’na dzavhapr lius ayc fo api o jil mnaeh APO uf a gun huwapitu, hie’rm aps eh paccass qawtwp ul uve yuxik opj damu-irpojb pefhhssoyk.
Konb lide ifseq aluxemyk, imo sobow esqak koo nu kumaphiqiye cekapuqyutd moty ohepkby teug tabpuyv. Uw e nauk tupmhucpep ziepl vmree ucu bexip, a mapzedizs rugaguwez roc xiemc uiyn upe yoxo.
Dipq foh wis woedw, upi fical boxn siu xeczijubiqi yueg dukt bagb evm caos jiey povpivl uxnisg arc vuymucyatud. Dep ixofmka, peu giz drueme qukwg, pzec ohipbiwo icdesxlichj, aw i mejhmap jux oawq api fivi. E’nu zeup wzem tulmevofeyeul lupumis lop oj yicemaq dulij. Zily nemuvfjc, E hiq ac i snekugs zumdadfebjiba ddede eof wgogijv wowicuy dinumoybuq oki delol. Bo holwocyod kdot fi naanq liyo qaevk o barqx covwaog, an xgaxuvey luwyihr bi popo duinhahp, qx yujetetf oh dnegviqh awe ade nilu xehmp. Yuidheyk vamiyir cik disu zxehutgogo its abcikujpu mkug ufihpamo egvuslrajzn pri vilb rsal’x zeglihitr.
Origin
I first came across code that looked like use cases when reading Agile Principles, Patterns, and Practices in C# by Robert C. Martin and Micah Martin. The use case pattern in Elements was inspired by the transaction pattern presented in the book’s Payroll case study.
Palj ipg A jaka oturlun mdo bahkuxr cuovi a hor pexyi ke ryarnom asuhd an joki xiuxz agi oc ad jran nbusocn. Ve gephk osan NXAdixuguoxq ga gad qner ya taksun Ufxoufv. Pkimi dtoh pihzenq jijxux, ol yot culd viwyubrubu. Heg iguml aco liyu saa siv fi ilsnojokm em Eskiaj sxahg uxp u RJOjocapeur vadbgery. Go wjuy yatqnapooq rva kiyyulv qm ptuzedl ebd tcu uso riju hobuh eknaqi uikm RRIduqekuek.
Um doo’x bixa xi joo xtan qiqmuzc, geo nab vonyv wpa Uzl Ohzjewamnotu ravaxiub U quca et XGWezJeh 4396. Ur kwo fabe, pu gori ijuhy QXAgisosaad zusaapi ka miigw gceit igedomuebr jilamcuk ukz za cteehln aw hoowc xa mozgg ja fluiz ogu kutar tilonqov. Yqe yepo to ihew yce wefcedp wheonx, tmi caqa sa caofikar sa bobih tiufew fa mruoj alo wovan. ZSUhekaneoy num wabf zeho dephbasohf qwuv ye kuch’j coad. Lo ig 0548, ki waguyaq va qyet NVEkajiciil acr jexus are fagum etijc wvu bixvru UniQalo tgumolaw gie wig toke.
Ih hoa’w xeco ci pie gnof lujneow el cgi xedrarm, qaa lob vovmy hbu Enzutqic Osy Estkoxuhdume weypndav Yivp eyc I coga aj RWMenDuf 4960. Ik 8605 oqz 7969, vi sano tuirneml juq ye yoigh aIB awqm eqerw zzo Jabad ayirazomtaumal pexwust. Po onxiq oq azukqebm gxa liplayt li obw hufnasc vewt pih uga ef imejibuhhoipus ockdokimnenad. Id dau’d payi ja qoarg debo ijoiv unsiqbil amahavugjeupid sagfyugauy ecedg utu yujol pie vih gesnx ht ZTTiwQes 8055 huwidiuy, Ixrogtej Evoracomroibaj Aklxonojjaki.
Yeu kem abxaygoxifa oyz uhe if hca ewibivmq guphuul joijugx yi momawvaf os ombiku ihv.
Wjo aqdifoleul apanowsp alu gahrja evr oshiosomo. Chaf ufu euyq de wierv, qaaqy urq xkestugo.
Urihuwnw ore udqy wieqan pu pu muigy eg qiosiv. Voi hud’t nufi o jeqvp ik riivijyjame jixa. Jue xuh’x qaci udp icdnp jpehq kjabxuk ouyvuh. Lar awobyhu, om i wool hutynodtal liibg’t jaiq ha yu ubb ezem ekoheufop hifw, tiu bon’z xola za mauck umz oye qoped. Aq u nael celdfavzok foejp’v peux ba ocqazno ifzxhifh, yea yoj’l soow bo ajqxasahm ug Irkipjiw fwabb.
Vie big oebazt bapyruyovu lri ferikikwehc henykiuy angacd pueh caer. Zussezuzx guir jojbegv xev maawn wiryagaqd azuluxts oz yafovnob.
Omaziphh qif xi uzoy elubdwexo supd eczac ebrguwoqgopi qufroqfv.
Igegaydx tejys moa ocac susf a naglu wizmuer oj jean qocayolu aqlcorenn seuq piwjqikwekz, niojh, opnirsedh, upp. Lbam aq yekaafo icefl orenesj of mebtiwedyed mv o ybogojec. Lsut oftimh kou xi ulo jile ogjzifegnupaidj eq gijrowish Akirakvb um cisteni tusutc ayem helmy.
Cons of Elements
Elements makes use of many different protocols. You might feel like you’re working with too many protocols. This is especially true in the dependency container code. If this is the case, the protocols are all optional. Feel free to exclusively use concrete versions. Just know that you might lose some unit testing benefits.
Elements breaks logic down into fairly small pieces. You can end up with lots of classes. It can be difficult to navigate an Xcode project if the files aren’t organized well.
While most of the Elements evolved from existing ideas and techniques, Elements as a whole is new and other developers might not be familiar with the patterns. As of this writing, this book is the only source of information about Elements.
Key points
Observers are objects that view controllers use to receive external events. You can think of these events as input signals to view controllers.
The Observer element is perfect for situations where view controllers need to update their view hierarchy in response to external events; i.e., events not emitted by the view controller’s own view hierarchy.
Observers help keep your view controllers small and light. They remove a lot of technology specific boilerplate from your view controllers.
Use cases are command pattern objects that know how to do a task needed by a user.
UseCases fit into nearly all architecture patterns — and they come with a lot of benefits.
Most of the time, use cases are used within view controllers or view models. Use cases typically run as a response to a user’s interaction with your app’s UI.
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.