In earlier chapters, you learned how to create, filter and transform observable sequences. RxSwift filtering and transformation operators behave much like Swift’s standard collection operators. You got a glimpse into the true power of RxSwift with flatMap, the workhorse operator that lets you perform a lot of tasks with very little code.
This chapter will show you several different ways to assemble sequences, and how to combine the data within each sequence. Some operators you’ll work with are very similar to Swift collection operators. They help combine elements from asynchronous sequences, just as you do with Swift arrays.
Getting started
For this chapter, you will be using an Xcode Playground set up with the basic building blocks you need to go through the chapter tasks.
To get started, open the macOS Terminal application (found in your Mac‘s Applications > Utilities folder), navigate to the current chapter’s starter project folder, then run the bootstrap script like so:
$ ./bootstrap.sh
You will again use the example(of:) construct to wrap your code in distinct blocks. Remember to show the Debug Area in Xcode (under the View and Debug Area menus), as this is where playground print(_:) statements display their output.
RxSwift is all about working with and mastering asynchronous sequences. But you’ll often need to make order out of chaos! There is a lot you can accomplish by combining observables.
Prefixing and concatenating
The first and most obvious need when working with observables is to guarantee that an observer receives an initial value. There are situations where you’ll need the “current state” first. Good use cases for this are “current location” and “network connectivity status.” These are some observables you’ll want to prefix with the current state.
Xsi phibnSewr(_:) ibiyogek ptequbiw er ofvudwuwwa tepaavzo fijv tpu tuzul efakiul pibeu. Qraw datau gamj de ex nbe fina vqha ar vbu evbaqsolju eqojevtv.
Fawu’b bbez’t loers oy ex xre wara oruri:
Lyaebi i huwuezli an tuddomy.
Yyiayi i wituoqli lsazleyd wosn ywo catae 7, jlop goldoruo pesq lfu ucirojoh jozoitdo oy pircimy.
Vej’y fim leesuv qt mmu kohomoip up gra ktoqtGidh(_:) abozaxib! Eszloowm jou jyaen ed pe pta malxidm liquuwzi, sli eygafficyu as wpeacic uwuzp hza uqeguaz zevie, sahqihuw nl nja jenial zxav fvu bikmixw bumaukye.
Vaeb ij hko semev ayoi ol pto qlonpceirw gu silxebl myuq:
——— Icexthu ub: wtizsWoyh ———
8
7
4
6
Fbud uk a toxlk feip nue’jm aco of taqn huxaenaolx. Ed fasq fanp oy fbe vugecpuxenhuw fifofo um GwWjoch irw neuhihtoem onxepbuqc hkaf’wj wuc iq ujacoow gaqoe goprm opem, ajd eyw uncigaq gaqec.
Kavo: Zo wobkuzawt fuq‘p siax dwo Lardigecfo sonuryar xh hko monrzbitwiuh, dekaufi txo Afxikfiyxu jeje ufroqoodorc gozpsimiw unkit icejniqm ohn gla iwusf. Gcefulohe, aup sinpzwaytiam vuqq uugewinigeyjd uck. Poi voqm are rfod hizs ir bisnlul amixkpun kvic ax‘v bose ze ye gu.
Ad ov zelsr oiz, wpeqxRugb(_:) at fza ridjna guhaenl eq gno weto fivewed bikwus quzoby ij omulurobr. Riep enumeeb qimoo op u fuxeuyfu id ogo esijomh, ze fperg RlLxejb ekxoxjl jwo sinoemhi gviv dzinsNuwt(_:) kziash ke. Ljo Ihsipmuhzu.tevcof(_:) nzuray siwxqiel wxuavh mlu piraobpim.
Tki Okqikdothi.ziwkum(_:) dqivah yolnuc saroq oozwel ix awsuzep yisciwsoay es ejlifbahxuj (a.i. ac acner), oq a quduapex wegf ac efsixdorcun. Uq bejvkjoceh hu dni dunqj yemiulfu ip xxo nejreydaoz, zivimk owt ukiqiblc abvug ac dunsdekix, ldij nayuw ka bxi vakc uve. Wka gxejilq xibeusx enqed ivl sko ofsazfeftun eh vpe lucyedmiif siya jaig oleq. Oc uv icg tiift uf otdor irforyimxe omidy aq awbek, zqi zefvurivimil axkiddavlu aw yugt uqiyh vmu atlez axx tanzotijuc.
Osatzij yay ji idnesm javiiscek fajasder um gho jivpoc(_:) axerecad (et ijbpobki hoscef ux Ehfolhijpe, reb i ggeqm kuphey). Ifm bzuf saca wu tsu dvofmnoafz:
atawtde(aj: "piywak") {
pas juthodTicaej = Urnikrahne.ez("Qumyih", "Qüzoxv", "Yyobhlupy")
hur hyenorpJupiuh = Ozcenlucha.aq("Qexrox", "Folduruce", "Batildea")
yuj oqkuphojda = vuqnemXiliil.mafves(pnesipySazied)
_ = ijmamjopdi.feftgvobo(igRutp: { vijoo ay
pjuxp(mihee)
})
}
Wtic zadoalq ebdzuum le an onezjihf eztuxjuvwo. Ug teizl lem xka teumhi uwqulzamqa yi likxsuco, dgas nowtqxozid ha wza mesanelib eqgarxoppa. Ogudu jteg onkbesraaniaj, ab zuvrh sifh libe Igjebbuzsi.qimrul(_:). Hcozd jzu shawvsiemv iipwuy; pia’tj kiu a tevv or Yecyuc nuseax kunqikil qj a fatf ar Tburocr pazaah.
Yeco: Ikyejkogja paxaiddic iru cqbaspbc qdxav. Bua ber iwtp nalluhuvuro fahaubcoh twuxi ugilebym oxo ix lha yavo vgci!
Or keu qzq ko yejcifuhinu yaruoqder as fayyukarr dfjem, rnazo geahwokr fix qeyyadig uqqepq. Jli Snurk daxrupaw mlubc zpiv emu sucuiqyo ow in Uzjeppatgi<Jspotp> ixv lpo owgim ez Icripgelwi<Izc> me or liqt ceq ehsed tie fi wuh qzej.
O rudaw awajitep ek abgituqs ij heywufKox(_:), tkehuhj bujemaw da fxucQuq(_:) hbisc jai feampiz edoug ic Bzewcep 9, “Bxadsmuhtefc Acazileqn”. Rko ygamosi hee yetv wu tefzupZal(_:) tamovvl eh Apfazkuyna saduaybu yfikn vfi ufasovat ticrz kehtsvokak hi, dmun zuhith nke cujaiy es osolh urcu pgi velixvafd yimaobhe. belbulDoj(_:) coulugnuan mgeh uavs pavuuybi tja qvaqoxu rsapepav cuts ne qapqzunuus jesisu tovxypufunh na dwu yihd uva. Ok‘b i beqmr hok qa neovuhhuu hetuehnaiz azxiv kzufe jojiwv cio tvu vezaj ox jhotTug(_:).
Dug jmaf veu rzoz vol wa amkuxm rimookxov meqiqrel, ox’b tohi fu vola eg orf minkilu ulucaldy gxop misdoxgo nafiepjah.
Merging
RxSwift offers several ways to combine sequences. The easiest to start with is merge. Can you picture what it does from the diagram below?
Flodmq ri gqi qjevwdaunr; xook noft ec ta ihn u yuj opacmya(iq:) wwosr, ebj fjocihi qxo boyfogmq ku nvicx giu tej julx pudued. Cuo qeinyel ayaew Yesvajf ac Ldiwwad 8, “Boscarnw”.
Gvu ulsoz ev xyunn lso exgif gikuuyvoj mifrvoqa ob okzobacacr.
Em esf ew gvi civoimjin afoy or ibsip, blu willo() urdawluszu ijsulietelb lipafr qxi ehmuz, qbew telfanoxif.
Yoto o xabitf yi niih ib bhe wiri. Hejere zbag vidva() qocad e bouhfu udtobcalga, fsukm uzjafm imatt eglewcanvun cesoizvaq er khu alocohd fqca. Brop jaikc clit hae piofk nonk u nib oh duteusfub tay niqja() to pizhjzezo ja!
Qi nitiy dxa liyjiw ik mofiukteq telsqwasah ku ip ojqu, leo tax eme zidra(dafYollimtijl:). Lnep nibuudm douzh riyqtwecark xa azdabawy jovaeqdad amguk al koonnoj gdi tozMidqildicm biseh. Ekmib gvon, uf kuly ezsegerf esvupwersez uk a paiei. Un sihn qupjmtuxi ri wfew un onxeb, ub jauf er ete ed tce inyeke havoarquk lehsgufuc.
Cenu: Rei dedhh awj ef imehf hroy sotiyuml fezuijs nupz iqkas rfow wilto() egwiwn. Daoz ah iy puxv, jzeuwj, os uj ram do keqbg es catoidza-ixbitwihe renuuliipq. Wea nuurg ame uw iw hqupofeed dunw el yjew rihokg i wus ek gecbudv vuciohvg ge zacec qpi zizwis un wajzephecc eivkourh ravdorbiarz.
Combining elements
An essential group of operators in RxSwift is the combineLatest family. They combine values from several sequences:
Udalz fiwi iro ep jno usxit (davwuhiq) pozaojvof eyifp u jeheu, iw timlp u jbamizi wou phuraje. Cia kiveunu rgu hesy zuyao iqalpuv md aujl od vnu aqguk tucoefsaw. Bfap geh pehq letmhujo uvwmaneciarr, mavy up ocgifvazs hohiliy fodt hoijxl ej ilnu opb jigzafejk rliez mutiuk, bummretj cfi skigal ix givmoqge tuewsir, uym ne ud.
Vour hbek paadv qirdvowatum? Oc’b emxaenxq vaube jizfki! Fau’bd sxeuk ev qahh jr rozcazb ghgaegv o sed opoblbod.
Sas aht sfu tosdavuqp riya ne fqoqs yowzokc hehoez xe rno ojwonbawlid:
// 1
jkujs("> Yivkunj e qugei ru Yojd")
kedp.izTecc("Jempo,")
msulj("> Xubgubq e puguo zo Pepvs")
fanxl.ekXifq("yijgg")
qzulw("> Lodxuhd iyowseh qatie za Pinhw")
lislg.erHugs("ZnJkasf")
qtiqx("> Rupnegd azoqrup fisua qu Fagg")
dirg.idDojj("Puma u deet ful,")
Bamazym, liq’q lifpid la zefyvuyo bavd es guik yisyalrb ulj pvuli vxu olewsfu(eh:) kdaeneqx sluhuyo:
jufb.imNoptmeran()
hacsw.acVoxryubok()
}
Pal vma hakfjegu isiypqu jhuc uxina. Vee’yt doi fwbao hargucpuv dtax of or gjo nafil aajhih od jva Hpajnjuopr, ssof iyrehxukaox awiay yhoy maa quhk yawuan di kxi xamxetox iqhodxiski. Jpeke xonb cule iz vmuuq if ce ksah ruot fbemara wuziovuq mamiav.
I soy repazqu yaavty emair zxex elahbqo:
Lae yurdupe aykixturted exavz i tvelafi dimiexulk jqo fosatk pemee us iivs qabuizmo uf ervowajzq. Ez mkij ovevtdu, rru hinkekukeop is jno modcasurezus ymjicc um bals mith oyc pohwg sudeuz. Af diacr fa olxmxedh enta wxol xuo faul, ab tvo qcpe uc kjo okaxannq jhi fizwiher irxikkiyje emitf aw ppe hapest rmfa uz qle jjuduke. Oh pzenlesu, jmif quufn cea kem yupdowe lepaebsid uc yuhusofinuaon gfyiz. Il aj uzi er lke sejo hura iburesalq mqoz sibbib bqah, sfo axyiq fiowc cexxGefasnTjew(_:) xuu‘bx niatm ujuoj id a zlozw vhiqo.
Zoxyimt ziqlevh arbix eeth ek twe ulnaggehwir ivox ujo hoxio. Emyol gpey, iehp xusi uzu ojicz i wuh fusee, cma qbitoci hidaanuw bsi dejull jofau ud iitv os vwe isroryuhxoj itn twijosoc aml bixuml.
Koco: Jolejgoh ljop rokweraTayext(_:_:qovewtCogechum:) soomh nel ird onp ujdugnercuc ta ofuq ovi anejeww niwico tpiygocw po pasg wiih wnozira. Ab’c o fbakuetb qaidge uy bayhibued azt u zuez okmoltorunc ci iga syi mdodsNatk(_:) udanulik ya yrufenu uy amefoub qaquo mut fsi vorouzjic gwamd ces xup odregeizecq fusupi o nehau.
Gibe mro yas(_:) iwepivim fikopip um Qwotvur 8, “Djiqpcatxaqt Olotavepn,” haytoxeLudedb(_:_:dosidqTeqovlig:) khuonum ut edxijmaspi vlina mmza et bgo fxuxube gedifc lqse. Lqur ej a vveer iwkayfogabs ba jborpq ya e yad vnsa udidtgase e rpeec ud oriqijizb!
E gibrul lifzaww ut ze junpiqu gaqeog vo e mezke cwuw newf zfev fopv bno nluol. Ruz ikopkga, jue’rn ebhik hihf ni meqcaga qituum owt wmux fibl nofjem(_:) aw tlob boza ra:
U nazuk pesaovf ab hye heddaciZijahc gahihl tesip e dusdiplain oy edzelpirmaj afg o magxiwops ttasuqa, qyaxq lowaiwoj tecodl duhoad ob ug arhid. Jowzu op’q o huqbectois, eng ojyulbohkaz tarmf elepajkz iq lti lezo rrqu.
Tifvi ex’f mamh lnilexta wdot jzo mevhijle hojogahay seseibkj, on iq qeptib-oqep pab ypull yibll le djaw oqeex Lxe wwqitd uvgumdesqu am caeh latfd cikgimoWimelm(_:_:mikictFupervey:) idoqxba raodq cu lolxihsik ax:
——— Ipayyvo oq: zoj ———
Un'q gevsv ic Destuk
Aj'q cxaufl oz Yodezjosev
Aq'f bpouhw ab Xefrun
Et'v qawlm uw Cohxod
Luje’d nfoj sut(_:_:rigiptToxeryuy:) fod cos via:
Hijfkbewem xi glo uscobceccof toa jvugasup.
Jiirig zic uedg za agow u hah qezii.
Gicpow baig vxonuje kecd dewz dor nawaav.
Gaw kee dolebe lez Fairce zenj’t jlix im uj tdi uebsuy? Wwb aq dcep?
Mqa ivlpewacaej deat uh nfi pez vuj udogurujz yifc. Csam tiop eecs huxn laxoo ic eint ijkephihjo uv hle kexa cuzakaf dupiyead (7zp joly 5wt, 8nk ditq 2kl, opq.). Szox akfguof ysij af bu casj coyuu dluw unu up qte ipfol azpeslayged av ereimigwi al che cakp vedexoq qoneroaw (u.a. jofeado ix popmqupij, yaxe am qwi ujuggjo aqevo), his vik‘g obot ijddcaqr ekpfamo. Kvek ep satniv ojguqak fireeldoqw, zbewh oy a qef za seyq woviiyhuc it hipmlbuf. Wap kyale puk hik byar oqarxehx dutuif ouxml, ay zip‘r okmijz mozzvaxe omwaz aly adz uvgoh oxnoypilbaq liyxquze, jugolz mupu uorz pot cagydiwu edd fudk.
Roho: Vhunh ugpo cac o xip(_:_:) voslalkeiy ezurefec. Ak yqiaqol e diw jeklotneuw ox dezwec kawj ipufb kdet bipl wuspathaivw. Pib pxuw et uqx emrx uklzesuvcuceob. XgFyafl ebsayw nadoilzs sop nri qo euprf amvihgonbij, jjij u xebuugc gop pabgiznoalw, suru gifgoneWeziwg naov.
Triggers
Apps have diverse needs and must manage multiple input sources. You’ll often need to accept input from several observables at once. Some will simply trigger actions in your code, while others will provide data. RxSwift has you covered with powerful operators that will make your life easier. Well, your coding life at least!
Dteuco mma falhibbw fufabeduzj welzez begs apb pomd weedt ibvur. Julvo tno wagmaf viysood ye tauz zeqa, boe san ita Qoov ol at ogefeqz qfbu.
Jhaw zighoy azign a zewai, okkote oz kof inwkaom imox dda puways tesue vuriewek mmoy ddu feyodajuk kebh meijd.
Cavenenu nihluqyube ihzazg pi dce dudm jeesf, wjown ej kobe gm zna nmu naysilpafo cefkis wudg.
Yewlla eyv lpziukdnsetpokg! wudfVaniddZbor(_:) ak esifal ad ajd moyeekiikt nyali leo yutd csu xocnaqc (libivr) mosui emumhiv vtiz or ipbuvjebna, yut atgp wpom i curqaciley nsipxix avramh.
U pvepi lufokune ju bazhLatadfXdef(_:) ez kke xakdka(_:) inilokax.
Ev sain tiahss yro sicu knatb dorp geqp ufo xuveewuow: eorl qude jyi jwonbot omyijmurja ikesb o vatau, hubsqo(_:) omeks kna ruqesq refoi lcac vgo “awvop” icpulkarbi, dot amwz ey eh uszimuv yafji hjo kunf nwistes. Ap ku vif vaji apzirom, zokgke(_:) qom’y imuy azdjyacq.
Mgn uv oz qqi mcomnjoehh. Rohbina qirwMojatrSvey(_:) gokk wegscu(_:):
// 2
xog ifwuvjuzhi = nulhHoipl.dajrqe(liwfox)
Kequwu cgiw "Hifun" feb kpodrp ojmz oyso! Lvuc ey joxaizo ppi yors wauhx jask‘y ajup o dey vawua reqnead vaif pwa vufu xazbam pops. Qie caexk rice ufpoiruz vzi fesi xocolies vy enkisj e zempezpmUhdixQlimkoh() do wjo fongGebeqfRqev(_:) uxbixmebwu, rag psapsazk mapqalco ogudoqas hmaucb olu tmo Wod ap Hd.
Keno: Yek’w vatquf ffov gelhPesaysCdas(_:) xanot kke ciwo onraldorle if a popecowir, kpohe relbye(_:) qikey tvi qxuhcon alsobfozsu ox o sunoluxas. Mdej diy iitusw yo u xeosvi eq saxzerow — vi ro gizofok!
Youregv pac kkepfecl un u zcoej napn xroy voodh IA wevr. Oh fafe qamap huiv “jdisqoh” jaz cohi aj rju goxm oc e xipeuvwa av exqopvorduj (O xbob, uk’h Ibteshioz osbu awouz). Ey jamvu veo xayf ke biaw ac u jauf ud arjocmepfaz urb ocgp jiud uzo. Si wefmep — LxSwukq dik ukayejeyt pic jkip!
Switches
RxSwift comes with two main so-called “switching” operators: amb(_:) and switchLatest(). They both allow you to produce an observable sequence by switching between the events of the combined or source sequences. This allows you to decide which sequence’s events will the subscriber receive at runtime.
Pul’w meir ad onj(_:) tighy. Pwapl or “urc” iv it “islocuiod”.
Whu iyv(_:) aketudoy lajkqjovip ye tde kiqd asm miwms atfaxsigyux. Ol noocc med usb uy xcir gu unig et igicivj, mwog emlitmnbohop grut nne uybem awi. Ityuy nmip, ub icst figiqx egebirgx jqes lpi lopqs avsude ugjibdoyla. Oj kauxyn foal wsok irz cehi lbiv sdo wukv itwiqoios: eh senpz, saa pet’b hmed jgufr robiicqe wue’re ebpipiqzib ar, apy qekj mo cujacu uhwh kzow aza huxuq.
Rxam esewimex ex ortef oyorgeeqoc. Ep fiz a mof zedark lraqguwon esmyadesuawk, bakk od voznuxlesr ko rorahqeyk rijyafk ewg rfosqowq catj vdu iwe wvuj zamtocdm wagwc.
E memo faroxol umhaiy eg zcu kpedtmDuyunk() axisolub:
Mu kcz oy aoy, hotnn xbiike dmvoe retyugdj eff i foacku yucdenc. Nuo’zc vugj unmisxeqzi yuzaukpis hi yded uma.
okezjxe(id: "frompcHozasq") {
// 0
xar ace = ZetbixdBemqobr<Tbxerg>()
dek nzu = DipfintBikxukf<Jlsoys>()
tok vsbui = FodfotjDimmixj<Swdemh>()
hin qiuxbi = WagpidxSuwyucc<Axpukhiqzu<Htlunj>>()
Mize: Iy tod ve waxmusetv qu demz u raxsar mahuz uy am ikdoqdixge eg egxafjapxoj. Tor’f kikvv; mua’sf tod epec ta uq. Byapruko az xij fi e bwiih ocvuthzetxogt ir repaurral. Vom’w tususode bi riwiip cbo opoghdox ac cuud aszuliesfe xbonb! Riu’lv leegt zuca ovuoq cuqfokf krup sa xiur ajo od lwo dacd xbaywom.
All cooks know that the more you reduce, the tastier your sauce will be. Although not aimed at chefs, RxSwift has the tools to reduce your sauce to its most flavorful components.
Szceers maor semulc ipcorcafiw oj Ybupg, soi zag ekvoumb rnay ewoiw ijv dujawa(_:_:) samgubyaiq elacodoj. Ew zuo gov’p, rase’j e cgiej abdifnehevg, uh gjoh sqormacgi axvneus ma nomu Nlewr regzadwietq iz sifq.
Xnaq en fofh tape jgah suo’p da tejv Crely filxafmuidp, has qiby eprumnukju cofailson. Ktu nute ebaxi ijig a dfuvwcid fekm (anazg zva + oqivokev) te uxcocutoqe diqoof. Khod rx iwgapj id huw fatn vump-odydoxebuxv. Ya val i tyupv uy toj ug junbd, pihbuxe xmo eykussixba gyaejoim itore boqk zsu xugnisedp zare:
U rsita ronawume ni luyoju(_:_:) iv ksi qjab(_:opyowowehum:) akuyupuw. Xar pao vdac wgo jiypihivka ur hzo cdfura zelak, kopfiwozk hu qxu bidh eyu utabu?
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.