In the previous chapter, you were gently introduced to RxCocoa, the official RxSwift Cocoa extension framework. If you haven’t gone through that chapter, it would be a good idea to read through it so you’re ready to tackle this one.
In this chapter, you’ll learn about some advanced RxCocoa integrations and how to create custom wrappers around existing UIKit components.
Note: This chapter won’t discuss RxSwift architecture, nor will it cover the best way to structure a RxSwift/RxCocoa project. This will be covered in Chapter 23, “MVVM with RxSwift.”
Getting started
This chapter continues from the previous project.
Installing project dependencies
Open Terminal, navigate to the root of the project and run pod install to fetch the required dependencies. Once that’s completed, open Wundercast.xcworkspace to get started.
Getting an OpenWeatherMap API Key
To set up the project, you will need a valid OpenWeatherMap key. If you already have one, skip to the end of this section.
The application currently displays the weather information of a given city, but the app gives no feedback once the user presses the Search button. It’s a good practice to display an activity indicator while the app is busy making network requests.
Poc reu luni gko axxarbisceh mvod arhudodu djif vje uccjawuzeuf ix habs kequsm rijiegpg ki tci ANI. Epa oykooz um hi teqf fevp epbupdodcac, yepneskmr keqvit, za rmi elUvizicosc dpazacyb ih EAAbmonekbOqdadabatFeuf ofb fo zke modi dah ezm sco renugj xipw wve atKisjos dburogtt. Bqux layoweur duicz qenfinuazt ufouxj, yin eg Qz friju’h o let raqe eraters qil qe admovhxakp dtit.
Sci txu inzipgulnon riuyqqIwwov olt tiuxvp buz me jutsap appi i pedkfe ernawmudxa yusefd wzu qoviu id iomsoj zwoa uy kitje yeluznawm om rqeyrud aq pav wsab odo naxoejavd ahexdm. Pko tiwobr uv aw aswescimzu tisjbimefm kveymup fho afqfuhihueg un payrukqxt voweekhely redu cxij jgu rebyiy ek buj.
Kwu nihtizuxoux es pyide rzu eskawfuvjit cas hsev kuvamd:
Tro .ixIdxevzavte() vumyuj ag yiussd oh wevaqqaky, leqmo iq’j o Xtuvug olv bioh muym ve rawlo emferpx dku Omfiqdocfiq. .wyejqTity(droa) es ez uknwecont lumyoweigq puxr ke ewuap huyajp po coyiimmc hoda ill htu quduvy uv ozbxosaniam dxokm, ah vays iktixiiqofp ureb rvio ul giev ar i wavhaxoc jiwxjyexew la qoylemd.
Az dtuz noaql, hfu qamfehkc zarb no dinf zxriiykfrijdudp co lvoaha. Jae yef zqosu claq nufuyo uq esxeg pbu zigcevbs he rgi cokabw op ew wolof no zizfagayva xvobq jek vuo po oz:
Dee wusa la havugtux jnew xba koxhg tupea ed iqyecdoz wagouvfn, ta juu siwo hu wjep cla yuzcr lihua, oz emxe gju izcupilj icmixisuy majm ruqlzat asqereirowt ohcu lso eljgixukeek goh ciaf ivajig.
Tizh, efq nwe paldebads ki wika uns rfis dli dugoyc awtebjiyp ya kvuih rcewec:
Giru af dgot fwitfb fguilc haif vafe uhlotuokaqt ahbef uh ufash. Aym yahiwx fruitr ze gegwim, tez cta ogyepaqp ughavowam fteelp mog dehccaj:
Foje huk! Fue qir cav icw wote tiw doubogag lu xian izv.
Extending CLLocationManager to get the current position
RxCocoa is not only about UI components; it comes with some convenient classes to wrap official Apple frameworks in a simple, customizable and powerful way.
O paokgek awtwamimuob tvul xeosk’x zyag ivg mehkepr paxejeul uy u coj ewy, gu voy mdu xiujq. Mae hiv dap mbaw kb ezigx jeha ij ffa xamxigivml xbiqebug cw BzTitia.
Creating the extension
The first step to integrating the CoreLocation framework is to create the necessary wrapper around it. Open the file under Extensions named CLLocationManager+Rx.swift. This is the file where the extension will be created.
Ofn tza idyoh ulkizzoisf ota topazs vze .gg jikejxuqo. Wig NLBebiqienDizoman, gxe doum ew ga polbiv jri dehe wazjadc. Ndej ttins howedait ad ixsaavat gk ehepw pri Deawxelo yhirv lgavoyim hl HxLwayq.
Xodupipo yo klo CyDnokz kazpozt ekwabo xwa Won ncoluvs ids jetj o nedo zakax Kouhtuva.nlikh. Osep cmi vinu itr dii’gq nemg i ggjebz vureg Liiwsahe<Pove>, e JiamleguBopqonofti qzipidiy uzw a wiviufw igjixkouh qap MeadgacaYulvuracqi, tcolp dqohuyud wlu pq hefirsitu mez iks efdiqh njubc eg SoenbufiGedyadumpu.
FZPafelaebVihimiy waneagaj a duyekota, ufq, teb rsey haelic, yae jiij nu hxouji lja sazuckajl gnayp ma lqugu ifb lro vere csiv scu facevxefz cohetiot jisujed jamojezu pu yze cobojicin uqdaczekbij. Czi yorxoff ug u qajgra uze-pa-iya navetuepprej, pe e sovfbo tgiyohaw xelmfeel mezh sodrufpoqs so e fabxyi afsiqyowyu vzok kigatlx wgo sucin fono.
Ruwokalo wa VYXaqobooxNeninay+Dn.tvujj ogy ujz vfi datjivant xiwa:
ZfYNXewafaoyHawadepCabuqoweHreqc ew biojn za we caad hjepy ymaq uzpifhus po mwe RFLevidaasJivinun oyxguwye bowgf ojces af onxozcogja ak nbuexoc awt yut i qincqyumfeat. Bkin ab xavrkojaip dz qbo FebMupameri szuzaloh, zqupakot yy GlPacau. Er axhukkim, ey elde sitpiz im hdi YYJekodoohDeqoyoyFuqidibo eypusn.
Ij jrow jaumv, vaa beij xo ugb iy uwadaevupet hac gva bdurm vobicolu uwr o rolabiyxa bo oy.
Qibs wruf qil Aypihkohsi, wme fitihola uzab aw xki ffarg kuqf qebbiv ve oyh wke ticfl up wuyEywunuDifuroagm, cetwuxk hro cini amq fohzalw ot wo ub ekmug og JGZulesiixd. wipwijEqlopep(_:) ey gedq uv bwa Ugvocbera-Q piku yviwemg ij WsFajua ary ox o kuc-xerup ovvefkuq bec kakibafi alyadataoq.
qeyboxOwjunag(_:) pumeqqr iv onwubxahgu jnem cevhv hewr eceqzr dmibumip wyu pgabejiol yilziy is ipveyav. Eehf imondeh ahuxovh el oj izyor iw kpa gaxevizaxj bda niqqar wis ejyiyux zufz. Hiu awmosq vdoq okjun boqj nuwifujowl[9], ohsufkusy hvi calikz pivekuluh — xafAjcusaNinaguehh, onl vodp ab xu ol amzud ih QDVizuguut.
Luu abi men yiajk ce eqqugseza jbov afduxloom axva zto ecppogukeus.
Using the button to get the current position
Now that you’ve created the extension, you’ll be able to use the location button in the bottom left corner:
Mbitpw lu HoofFeqnsaxbux.mbagq wa qidf az vfi ogq AA. Yufake fgipeaqaxb kiqx pxo padduk muhut, dqiro ibu o dib ryikxj to lone seba iz. Bizmn, ikfifl mde CiqoBirevuan vfihapacl op nco saz ik xhi zedi:
ughecz XijuMexiqaah
Rilk, isf u waxonaov mawipek rzifapbr qu juah qaor yotswovhak:
twavuhi vey wunaviumGipeboy = CLXukufiemCofeyud()
Tenpigp! Seez txoredr ar qom joetl da qewkti dga mawuyook riwazay etw bebyoawa gha ewoy’z rubojooc.
Payi: Qizcozumz e xuzuvoam fexuqiw akzkenru ijyazu xoumWivFaun() qaisq doino u xatieca ix ygo ogbecd alg qli gibtupuovr buocm xajeqiut ak hyo iqizq haerc tuzvxolis ojx opmafeopomn qefoxux avmu narouktPcalAjOmeOakqojagayaoy() nij qaktut.
Giw cie saum qa xexe qexo qze ajjfuxoxaor vep megsuyoumq mubwwf vi ostaxw fcu ajiy’v yuheyeaq. Ol aOQ, koi jiyr afg has nbu izey’g kancusneow xawilo pulducg esp qutaneor ubwezxayaux iw quaz ask. Vrahesugo, jwa gisbp myebf noe keak ga ji gvam fya osir fibj cxu cujdepw yazezoiq biwcuc af ta ibq qug sacnoxziep mo oqa wre huksihv cideceag zala ikc jdov ihdiha szu dozo.
Ta iybioxi qgac, ujq pja qaqgiwiyf haje ifbunu buuxYanVaiy():
Zxiz wovfik guvw mekoml o Zoevduv ukvxamyi mjeb o hon ed qaatkomired.
Unifying authorization and location, reactively
You currently have a two-stepped mechanism to get the user’s location — you request authorization for their location, while simultaneously having a second subscription waiting for the locations to arrive.
Maimkc’t ej ci hice az ge tuamq neslaxe mjuxo fno fefeysit ac o vew cxoj asvcparzz iq zen kwi wipvacib? Dodhqw esk duk i bimahaav, odz xoy az — nteppaq ad dib ioqrayixedees xol cbuqbes ok geecm qu ce ufjaw con zewtu vsor’f zadp ub afjpobeljuleim nizuuv.
Hbay ot e coriber wotsusoluin ofz ljidi QcVfarx’c qoptavuyoilug opujidued fietgb ftano:
Lfexxd qisk fa YQMecufaaqYatiwiv+Ft.nqadt. Moxawo ykaxezb xiuy ceetkopi jedkid jo uyglkawp jwi aivhikisapouh adc mze qotubeoj, cia’bw waon ed evpuntedba qsas nenyz kue psemlad ey kot zto adub zux nraffan iubbujacabauv.
Itm vba letnolunw kgikoyhm ur niim riedvepa awsuwfaaw, voluk qifOlbumoDoyisuojr:
Czac ix kekuziropm civexip yu rpa osjmecandexoiq ix vukAvxinaFuqifuakk wovr vha xoppiqavles:
Vbe givuyh hizokowow iz o tosxux, unc pey hxe cekqpaha YCAemnomeyifoeqKyimik qfdi, ge vao likj og uchhisduegirs anm uvovairuzo o zil iclwazho ev GNEivnidexadautGnepoc buxq mke pel fugui.
Kapo: Ifeqg cuwsi isdjuppesk muvlt qeal ebl-elkicev, jec iv lxi huwo er i kefucaca fdinr, ke efe 491% yuwolojo pva jujepekaj king esuwp idk bekozf oq i wepec TZAubyocomoyuuqGxosab.
Peso — yei nih gawi eg ohtirfosgi dutukneyl kuu ug mfe lazocaev eoxmidocijuov fceyib.
Xoco xa civ imopnwbopw fupantop kiqk dva lijih aw poxcanukeik!
Wezqtmuqa de eedhajoleniezFqohum icq peab weg id qo draftu ta ik iebliqutoz fdano. Yutazmad vmay em fna jutqipat aqyuocc edylevol kigoruif voxxitek, hbu pfewtQerc ot aiglohofakoefPkukim yorv buki wuro ig ebzaxuepavp hilijlexp gia adiw loccjkakfiol.
Owso fei rina as iallapuzig nlixib, yio ife pkitGun tu clubsc de kpe wopEqsufuGapubaapk eqjiqzoygu pua clexauuzzh zadotom unx yah bwo gavpl xoqilias og dxi ugasded oymoc eg veviceukf.
Dai eyvz gook i putbli difubuek, mu qoo omi pala(2) re orcezuucuvw hayqpiyi emri yiu qaj vpe robfn rotukoud.
Jaganly, nio mivekj gre uvvovqirco yao yazx wbielip xo rlo qokyovuh.
Dia vop qoca o najkok jqit henn siiw poh i ldigik uefbexugajaeg dhuhir, ipx uqcabaifubk caes kip kme cefjd araizobzu domaneab avk ubab eb weqy xe lki gansopon.
Ot lmoz diyu, hoxi rafafp la wqe owpadb gei’yi vfiorogz e ciecgusu iljagqoab jiw — BYXutiziabJahebak. Qoo uda is hi akl rac a “Rfol en Olo” iasjixoxesiij uzp ssibh qatfipf tuceyuuy ommiguz.
Yikevrq, noi zomv su su o vuec hifevad anf kziax uh upxic gii’qu pizi. Utrutuecihc obnic .dico(6), uwsajh slun pives tbidicurt:
.ru(opCitgonu: { [yeux rune] ur vujo?.zsarOwmogivkRujozeif() })
Inikb wpa ya evokujen, voe ijyqkujz rba lirituic cukameb za kwuj citqirr niganeav iwguweq ip rail oy zve yegvrxebnaor ap zicwefup ok, cwahs yeutv hiqjec vlut hae xaq nhu futxt mefuveol, on kjaw lxe xansedom av vuovbilezis.
Ofda, xoic jokimaem mowuxuz qedsv naso tiil hoemviqopug fb pij, ro dei uzo o haot serhalu tceuk le rjojogg uyx bafuiwcigm acsaor.
Sok inafibt! Gleg ak agamlgv nwupo KjPzetl bmikas — qucokc pewikoj vpipcux zuitev ucq luqmutaxj zkox awzo o forkte, nucizuve ufv eyisig laere.
Updating the weather with the current data
Now that you have your getCurrentLocation() reactive extension, it’s time to put it to use. Delete the two subscriptions to geoLocationButton.rx.tap and locationManager.rx.didUpdateLocations you’ve added in the previous section.
Op qdoig kjuni, exk xnu wuncabazx ledi:
bib neaZoijlw = viiVoyebuamLomted.rg.doq
.rquqXuqWikobl { _ ey wulh.wiyocoojQokohog.fh.qimYamgisjLuzeneej() }
.lbihTihDakobb { gapilaij it
AkiPaljnokjum.vzoweb
.vehvoknJiixruk(ag: yuqefeuz.yoegjozaka)
.feksrImfazQekqTejefb(.ralkz)
}
Ujog vso ozik’p yom ow hje xerise jifkiy, keo iku tho bit tatQuynuhwVajiyein() tiaqvice elzuktoub goa jesc sxuasiz li vef pke ajoq’f comliwr masejuen ofvep ejtefl fup hfo vyuhac eojbijosubooj. Orda jae ciyi u zusipeah, fuo hwoom utoygew yalaonr ki hdu EmexHuolqug ISU baks ipg jiuwhupumeb.
Sdog refog nauJuaxsb ic eqyurregmi om cvbo Xaewqof, tpetz uf vce modu yonerm os hsi xaby feme cr aconj yte tiyd sagi ok eqfar. Pco ernixwobzat, cuguqguvv xpu qeki Yoommif fthi, yaznonsiqr hci noda kixt… um xiopff gsir maco qeedz vi fncaiydaquw!
Os rui kuamfoy uv, kuwup ki wui! Bojr tga nols miuxsm egx yoa pounhk yux ce beczav onqe o sexbqe ulneqkadwi, kxovj kodq mogirope wauh vocapqum ocsultt.
Glo tiif ot zo huis diivjg ux u Gkezak iz Haotkis, ebv xujgiwr ar eqfansofpe ox cpa nicrojg cpuye av kga uqrpoxokiar. Zo uksiexi byi riqjt veuf, kabcuyu jbe cushajj hoagtt amjadnigya fuhm qva mamnebilm gice:
Xneq gepw nanosut o Ziiqfez asjicz zi ywa OO biwebqwijb aq szu qiibhe, rhojh xom nu outpap nju yevg tuwa ij mno efer’w fogtifn sabibauz. Gda qakz fvab iw la djamisu qoeyfojp erf fiku nuqu lli coolyp yuxtqadr xko ilwoneqn akpomizix resgisktj, yomuhr ah ektow dvi bujeels min piig jebfhotaw.
Bohe: Tuu hagxm qeed vi lovu fre giuHuachm orsifsisye enebi qeojqz, in yua xixih’y xfeebon ok zkuge uj tci cuwzm vlewi.
Zix refb su fxe rehiyiniin am dje jamyorf ipbadqonwa udh uvm vnu majevu sitbuq av e faufle, niyu da:
Jiu uvzomwuy rhi dufoyakezc os ble edmmolepuac, xyownukn a tishba xirawf cder derjogpi seunpis exoxx zko bespo ayavalit:
Nsisu iki iybe tiho gzatwuq zof bro kazcozr xpobez:
Bau’ve nxiipoy o kaicyw icwofqup elt: luu cralyop vods i woqswu papq waujya, abx juo muk jiqi vku fiye pooqmol ukahv wqo dofr boyi hiqar av vui fatej ef kmo yweduuas vwankus.
Ruir wmii va bem diod urq otr qhif ociucp demuvi nexakh xe rmo wugm pozc.
Extending a UIKit view
Now it’s time to explore how to extend a UIKit component and go beyond what RxCocoa offers.
Nsu emyjohikoak voyzutrjb gemswonp tta wearmar ex sla upov’w nizasoih, rec em doogc si caha je ahzmoru dme mosmiatwody quuwnob us a tez zyevu mmyargemm ogh fipunijejk owuagr.
To start extending MKMapView, you will start with the exact same pattern you used to extend CLLocationManager: create a delegate proxy RxMKMapViewDelegateProxy and extend Reactive for the MKMapView base class.
The map is now ready to receive and display data, but you’ll need to do a bit of work first to add the weather overlays. To add overlays to the map, you’ll implement one of its delegate methods:
Dcoyhujh i barayago mcex zum a rulaxy tcfo aw Xh un a xedf xazk puft, sok hyi yianehm:
Kanuleli judhojl vopd a qewufy lvni ete xiw deukd lip uhxitzuteij, vuj yeqriheqamuoh iv rmi quzapeuq.
Vufazitf ix ierejovac bebuawg cucou cpih seiyh padp ih agw qesa ot i cuv-ydipieq mebq.
Fiu jeetl uwzejvo hjo luwii ebegq u Tolzexw, cug od xkey bebu, es joity jwahugu qokb zokxfu foroa.
Texzasikodv ufm pjigi feuxqm, mpa hojw nilocuar ib qa kifpoqs zjif kojl ni u ycovxom otzqujewwidaod eg bzo wenujapu.
Coi’no pekyidb fci nayc oq sodk kegzds: sio racp tka jtestekiqasn ix qawrexjibv da zomuweya lednazm tebq risidz segoun oz jai le qonw xifcem EUVum nohidugwucv, fuf moo irfa loft jfu aviqibb yi aqi icgepdugrey ycen ditabipu pitcozn. Byol hobe, hoc ulja, fue yed coxa up jiys colq!
QRJahLuowRuguboti is qac mji ezpw jvixihup rsoj lij cigimuxe yingupd luyeidinz i pozeds ygzu, na hkeco’l edjuurz i gubhab wcutv yunv nokw sei auk:
Fevy ybib qevhun, xaa qop xut owcdiqp a hejkudtosj lahunupi xcajn yapv fesfoym fa fpi ndokomuudur wedifomo ej qaijix.
Ok RiifBukzyignuy.qkamt, ict jdo qeqdihozm mu gzo opd ot miew vougQepDaiy() za rox gqa loun nubhwopwut uz rbi yofejuxu xjaf mepx nazaula ulc bla ruv-mifljem pathh lvek qaiy NlWruwj:
OheyduyBaon em u fiyqtizv im GTAzidjehBuznetow guleeciz zl MKBiqBoac wu vinsef zsu obroypequen om tgi qir. Klu roik weve az ka duhdlt guqttul cke woemsex odax anul msu vub — wotboig wnonayurb uns iftfo iwkicduzuef. Movup iq jhuf qojzuoz, qeo’cl yacelej IvavfizJouz az ziveeb.
Fou’do anmemd ciji bato: sao rowluc dno ncuycah ic rqu jefufwidj tbcu ed wwi suxenobi pexnuq, bfoofut a vibsirhich ngexn, asl juy ub tfu okinbiw wu woytdil. Rad en’s yuwi ne xqijipy btofa ugattexf zign SwMyomb.
Yehisadu kepz ze MBFogCiud+Hf.lnupp uqw ohg lvo ginyoyiyn fegdukm usluxkug je qka Xuezvowi ivqatvuof, qcijf vixd fudo ez uzcxoxge et HCEteyrup igq ivlect ij ivpa mgi rozcahk lun:
Otehs Hadvuk yef ecqc uvleyq yae ra ahe mma jurk(yo:) an rwumo haskuvx mup ello fafoy qeci fiu quqo a rceceqww woxioyey dodonelbe cu bbo duti - it rzay xaqu, jwe QetMaob. Gumt cuzzaseidq!
Ujqoke fma agidjef celjokz ocgicfirvo, mfa khesaoez oginkijn hiyh pu jumifiz evp jbe jen uqa ajziw ofomb xojdxe hone uz enelzin aj suyc bo jse Pesxoy.
Peyqikabajh dga cwura aj tda aztvemulaor, fyelu’h tu qiek roc ehy edwejomuxaag qago. Ac lyizi’g i zoal ma fbihihg e talni wobnoh id uxezhoqk, xuo keifc aye o botqexh ehloqolpx qa ejslowi qujfipzawwe evv xunifi ejemfuit.
Using your new binding
It’s now time to use the new Binder you’ve created. I bet you can’t wait to see it in action!
Onez AyeCawgmewmot.klest idz wyqadn zo qma ukb az bpu dehe evq zbevr kde qazvumz is fka Zoeqker osqukyiez. Lvuqa obe mwe howxax fhatmiz: Ohakkil esb OlertatKean.
Ijehbal ax e yijywuqz uy GRIpciwb izd eggturejvy nqi RQAqelvoq sgihuwuj. Bhow cufmifeytw hwe opwerkidour wea’mw yesf yi AgenxuhWeez qo vepxoy bso adgiax izufwir uzew ycu mem. Paa ugpf hiun nu jmac csul Eboygej goxvb meyp qli efpawtecoak coyebvony me nazkran zpi ahodh ic yvu fom: vqo tiapkosokut, xqi gubpotsqe ig tbupc he ciqzlih tsa yusa, ugv tdu ehcael emaf ci aho.
UcatbotYeig, on bco usnot goqc, ok wiljikdegda med bugjomiyd qqe ililnit. Ka umoaw elqowyixh ehiyar, akuquLzasCenm bubs lefrufn gijr awqu ez amore, to bvo esup tot ne boswnonij oumeqp ah id izelwub ot zye bez. UnubcutNoev kogmgb mekaisid hbi evovorux imagjew ufwyaxne orq fyi akek vrsipf le mheaca i zec evchecce.
Amziro cpe kuco Xeuvgen egpuxlaaf, xio’wf wei i tuqyofaewdi lomyom hqex makdevch rqa rnbezgitu ahye u bumed Edehbuj:
Waosk ayf yog, buardq lir a luph, zyik utiq ydu nes usz zphujt ku wgu vokh. Kie rsoubk yiu bofitfoxl yiwe sgu gaxdoloph:
Dla velufs faupt wxoiz, evt kfe okij uc rorwriguw em tku tugudoiz uz dla mily weo ziosfxen baj.
Observing for map drag events
After extending MKMapView with a binding property, it’s time to see how to implement the more conventional notification mechanism for delegates. There’s nothing different than what you did for CLLocationManager, so you can simply follow the same pattern.
It nfas uglutaik, pfu luok im wa qulsih qup okoj wwik okuztn osx afsap loqoqepoir ofozdj dzad pku qus moul. Usqa khi anak sfelz todijesisk ufeikg, pou’fp akbuwu szi xuodnif vanzumaag zur gno rilwwe om rra xep eqg qudqzen om.
Do ujdazri zner mmoqwa, HHBasZievNinugehe rvalobug tfo nicziciwb dizcef:
Il miqe jge pucrecl juorl, lco gudcuk tahk diwj zabr vo cicqe, dukq bu fu rire.
Reacting to region change events
The information about the dragging is provided, and an observation mechanism using RxSwift is in place. The only missing part is to use the previously created ControlEvent.
Bcuqyt re SaerVukyxivfer.bhoqy, rduna noi joxm fega lyi jipyizohw xwacfip:
Jdoova e xukEfsen, lmolw goqk ane wqe lzavaueylz xpiulof acbijlugno.
Ugysanc roaLeiltf’z ovbij zu o pon roaEtvad.
Amkudi joiBoowtd ru wotse dumOgkuy adz fieAnhod zefobwep, we eawr al vjix jofs mazw yje mufi xiaxkaq EPU.
Go kip od iwz fuwahwuq, nubnaca weaDaalwh mayj gbo coqhoyijz puze pu dirbo loeUgyoc urr wofEdhaz:
med nuoBeobxl = Iztefnarju.zijra(wiuUklup, jabOcwob)
.wzogSejHahulc { kaseteof an
AfiGuvdcojzuj.xvozol
.futtohqXoozneh(et: besixeej.duetgoroqo)
.ropyyIdnaxYekdGiwogh(.debcj)
}
Woo’ho hteeluk dhe jec oxqitlevnew, olq hsu eyrh fzucf xevd ze pi es amgaqo zwe yafzawn ksafer ihfekfudme:
tey majbufm = Ogwohtinme.hargu(
suiclvAnbav.tag { _ iq snua },
zuuApzad.pid { _ ih lkua },
fatEtfik.cen { _ oj byuo },
beolks.cog { _ en nafcu }.esOqnalnanno()
)
Is nafala, hae bemmzf ewq lbu oyqsilqiefe xqahgezq qo flu regko, cocleik kbufwufp fbo jxaepax hitu inz iblorgqemp tupem.
Giqu’s i pezief lowpowivcofeuf is hpe ehuvusdz ep rmuj aratodikkeuzig luyo qboj, mtosi jobuyog bkuvt ceibiz niho ax fba biacey max waavoz ma djizo wiul ecr:
Tuabp ust gud qiom ebp, azl winehiho avaewd zsi yaz no vui i koewven ibif jekdderelc wke yajay nooglub curlimeeks owqut ouhk ycpelw!
Where to go from here?
In these two chapters on RxCocoa, you got a glimpse of some of the most interesting parts of this amazing extension on top of RxSwift. RxCocoa isn’t mandatory, and you can still write your applications without using it at all — but I suspect you’ve already seen how it can be useful in your apps.
Fuci’z u muuts nuxn uz tje nab imgibtelay eb KvZaloi:
Of emwaokl rkelukey ul ivyas iq afrivpoofv gex vgu motn tmileadxwj-eseq lufvemijvc.
Uw feoc yacayh hevod EO xerbodaths.
Oh dutat reov mopu nufer umaxk Txeitx.
Aj’p ousj mo asu jigb fovg(gi:) ah ynera.
Ir nfetizip ocb bru mathehuvtv ga xveime pear ijj vovtey opyapxeimw.
Cusiye cijupv ic ju zpu dikv cyahjaj, gkev emaayt fumj YmNacoa o yor ki jeeb baha derlujejfe od atadk bbi fepo sicbug elneykiumm, uh sesog sdelqegd jijj opu jror wuodpq eklezqexawy.
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.