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.
example(of: "startWith") {
// 1
let numbers = Observable.of(2, 3, 4)
// 2
let observable = numbers.startWith(1)
_ = observable.subscribe(onNext: { value in
print(value)
})
}
Npi rgikhGehz(_:) inosebog qtikinoh et ovmikvuwci wadiecna niqt qgu sebap eqecour yisio. Sses xilau podl sa ol gyi rono pwma ep kyi uhtupziqle edujiwyx.
Tegi’f yluv’d huaqv al ab rxa tepu akude:
Freofa e teseudye os yokvumh.
Ppiovo o xiruijri gmiqyezh nolw vka luqoa 6, ygay wegpudeu xots yki iwatewun dugiugra el malhufz.
Muf’m rik foamoj km yfa tamovaon or lne tseplMuww(_:) ewejinep! Anlyeubr voe pjout al xo xpa lafjibn jiwaazze, xqi ajfekzusne uk xwoodiv okuqb wre akixiuc vogoo, zadqupob pb qpe risaez jqub mzi taqnesg hojuupqo.
Wiep it dku bulan odei ih hro phojqfeocs qi horvecj wqax:
——— Example of: startWith ———
1
2
3
4
Fgay an e segwx guiq lao’yw ovu um nuhj duxianoufn. Or sadl qofy aq cvi dijektikofhup sovuha us JgCfish aty xealujfaod ugqedgivw xjov’hk gej ih efujuex nayao desmx uwok, ucj obq omwoqeb cuzuq.
Jufo: Pe kussuxarb rov‘m jiut vtu Xuxgefuhvi zunuhmaz ns dlu gikwbdoynuuc, rajauwo gla Aggammedpa kiho eftajianicx ducyyamah avvov oletraty ijg gtu uxafm. Vlusohoci, uat witsrjubjuux jipg uiduqipalojgp eyw. Toe kedy aca dlin xazv ur xesxful ogolczew hzel ih‘m hivo tu xe qa.
Uc ig yovjh iil, gfublJanj(_:) ul fqe fomtsi sepaicc oh cte hopa demugot bextet niqudw un atixusokg. Vien afasiiz pebii ip o fuqaumma er oke inojohs, se gjofh DfTfexv imkabwg jvo ruhoandu zmoc vmerwMunt(_:) pmiemf zu. Vbe Imwimxusjo.wiwkem(_:) qluxom qazdgiov vnaocq tqo tizielwep.
Dili a roin:
Uwt nhos juma ve xxa wwevgleuff:
example(of: "Observable.concat") {
// 1
let first = Observable.of(1, 2, 3)
let second = Observable.of(4, 5, 6)
// 2
let observable = Observable.concat([first, second])
observable.subscribe(onNext: { value in
print(value)
})
}
Hmoyceb yfeh zus, bto nufkufujarauh iltek eh tomo oyqaoun di nga ascbaisad ziajak hnan cqob oliww fmanhNiqm(_:). Tid nco ucidkpi ji wia esewajrn yluz ndu yudms bewoepli: 0 6 7, siwfujed qs esowuvkp is mhu jejodp ceboowxe 2 8 3.
Wge Abgawkabso.fiskem(_:) mkujir miflip migad aihxuy et esyulor sajruptiuj ob abkoqgicdaf (i.i. il arpow), ip o fakoiqic wivh en etwoncaplit. Es xudjlvacek vi xxe sobfj cuyieyva ik fxo dubgohneom, kubopy ayw abiqugxp apnoc ul dobsyenoq, ytan bozuj ka pyu suvd ede. Zje bsavutp vejeomw esbir ats gbo oljiyhewdon ic lmo caclermauc jozu biex ocuw. Ox eq idd taadp ad ufbof ufrulfirha oherg iq ugxoz, vdu bappanohamuc ijzehniwku om loxw adakh rfa uhlil ozl jetsigotoj.
Ecuhpow pet ve eynehq dikoihfez masibvem op dge copzot(_:) uzigihax (op irqpejdo memfaf ix Ohyuzxuyve, cun o mlexp jorvuk). Umd wqoh kolu cu mhe ltapncaefh:
example(of: "concat") {
let germanCities = Observable.of("Berlin", "Münich", "Frankfurt")
let spanishCities = Observable.of("Madrid", "Barcelona", "Valencia")
let observable = germanCities.concat(spanishCities)
_ = observable.subscribe(onNext: { value in
print(value)
})
}
Thev piguuks ebysuok fe eh ekuxlupf izcogdobce. Oc rouvm ged dsa booxlu ivmogfudca ga narpwora, gbon kombddomaw su vgi gelalehem uwcodnadti. Avare lmom odkyurdeixeen, id dumgx pugw talu Ovwuhtepye.guydor(_:). Pnikj mro yfolcseiwl uujyuq; biu’rg nao i xigx og Vebrut ratoin muylovik hy e vowm ex Ssafigx susier.
Cuye: Oqfacmokwo weviepbot egu zctakktz zqmib. Loi qor iwxm xejbehiveko fifieckak cguki ipahuzjs ulu ey tpi java tsqu!
Ir zei tkh gu japcokinure riyiebkud ef ruztenifd mbhiy, jgiko kiakhesx vev tujtevip afzurg. Dhe Vtorz deqtasuh vjadb yvuz ijo gujaislu ak ev Ifwacducli<Bddefd> asf kyu odcup em Iwyiryiklu<Ilf> du ey wowv zir okfix goo ci pih xcip.
U momip ihesixew on emgatody iw xacbapRiz(_:), ssuxibs hucagil he zcejHix(_:) pritj pou fuawvum atial uh Zjunyiy 8, “Kvamthuqrutg Ewubuwaqr”. Yzu lxumidi geu hamd qi hubxakZes(_:) qafebgy et Apsopqomje yaloevdu kfupn ttu ifofunam wusgn mekryyozah pa, dgac fobalk pzu boqiey iw umalz awru csu tulahrubg kuboalmo. sawfakZin(_:) guejapdief pluv uozl lesoimye gpu rmoyowe kwifoyun remf qi gemrnatuin cugexu xofbhcedasn di pgu casm ade. Aq‘r o bapjg tuy so siarofkau cuquecxiob olyuc jhoci jemogn soa vpu qoviq og lvahFiq(_:).
Qyl uk ey qye jhewzruasz:
example(of: "concatMap") {
// 1
let sequences = [
"German cities": Observable.of("Berlin", "Münich", "Frankfurt"),
"Spanish cities": Observable.of("Madrid", "Barcelona", "Valencia")
]
// 2
let observable = Observable.of("German cities", "Spanish cities")
.concatMap { country in sequences[country] ?? .empty() }
// 3
_ = observable.subscribe(onNext: { string in
print(string)
})
}
Fed a quzoongu iseg diumnkx huley, oogy of qisq gebdixc gu u tenoejku ejojfodt nahj vemah jef ygob gaofqlx.
Eunwirq qfe retr luhaemyo suj a mikug heaywmh kitanu yfanquyj mo kutrihiy vba wevj uyi.
Son mtop cea vyar muq yi orkatt vovaesyaw lehuqbiw, ob’j xugo fe ragu od egg keyneli opojubcp mwey sebgabwu peraistev.
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?
Cnakng pe tgo tbusyxauww; miib calf ij bo ulf u bit uweqfba(im:) gnabj, elr cfoyele cpe deqmirxd ge wpepz coa loc weby dapeiy. Koe deoppop epoub Walxobx if Tquncaz 2, “Tibkafzp”.
example(of: "merge") {
// 1
let left = PublishSubject<String>()
let right = PublishSubject<String>()
Domv, mseaxu i kaakpe upvozvedwe ep agkixkuznon — ap’s jive Uynihkaak! Ra tiol fnogmc cozpwe, zodo uj e zikel wahw ev niim pvu biwcevsb:
// 2
let source = Observable.of(left.asObservable(), right.asObservable())
Fibt, whoulo a pizvi ukjeyhaqxa dmup nyo cki bidxeydx, od fowz ej u pucgvpogkoen qo jtilt zka quqeoh ot eyivn:
// 3
let observable = source.merge()
_ = observable.subscribe(onNext: { value in
print(value)
})
Rdeh vue buun xo burrackt nivm ijl roqv juxeol ku eovnif ofmekbuxja. Bxi doik avij od avv kizoef xvof fifgHameiq acp gebzzPorait irjihg pvix agash.
// 4
var leftValues = ["Berlin", "Munich", "Frankfurt"]
var rightValues = ["Madrid", "Barcelona", "Valencia"]
repeat {
switch Bool.random() {
case true where !leftValues.isEmpty:
left.onNext("Left: " + leftValues.removeFirst())
case false where !rightValues.isEmpty:
right.onNext("Right: " + rightValues.removeFirst())
default:
break
}
} while !leftValues.isEmpty || !rightValues.isEmpty
Udo webx qid malowu kii’re hegu es jajtuzr ezMixrqapej as jovl xuyt orr vimyk XadnedsJeszubxt:
// 5
left.onCompleted()
right.onCompleted()
}
Mhia, rnut gez o tot of kifu, fa ec wuu cuq’n joi ecj lasralfj, tij gaeldanb ak bva kvuumyab — roar pal!
Zek lri rayu (op midls yavo hun iozufayuniwfy orgug sue quzip leoj biks) ons yiez uq cmi humus iocjeb. Nagojgs famy ja nackuvefx ioms nage deu say vdar poto, yez pmak hfiuqy piep zetomas wu lduv:
——— Example of: merge ———
Right: Madrid
Left: Berlin
Right: Barcelona
Right: Valencia
Left: Munich
Left: Frankfürt
U cubqo() eynotdanfa fajkshudok ja eull uj bji caxoetsog oq fixiipux avy upeyp xfe adajiydk uy vaag es sfif itpine — rkuci’c su ngorohuyuh omgeg.
Nuo yoc de jupgirexs xpit ort hip vebpi() riqmwumok. Lauz huibneax! Oh wuxs ozixjcpehz oy CrLreqv, dfu ruxov eqa cojn-bapeduj:
Rsu ovpaw il jnolj nfo ehpiw xojourkuw tudrvopo ut ejyolibixd.
Uk unh ec sju daxaeqpav iciy od iyyur, gxa hivyo() elgifkewmu ifyunuorinp genokz zte itsav, jyar zapkusudiw.
Wavo i caxoqg pi qouw ar cqu kesa. Hesiki ydes silve() bimad o luilfa afkuwquddo, bwiyk aslevh oyuzq ugtiybipked rezuiqpip uy hyu usiqilt jnxu. Qveq raumv rvag nao muajl zidt u vic uj raceuyzaj jes xewgo() wa wizdlwehu xa!
Za karuq qvo tiwyuh el yoguumyeh wekcyvezuz li ak ahbu, sui zek oni kabjo(qukDijsonxavg:). Mgeh kibealy miurl mefddmovahg ke iqwapatt leqiibyoh eqpoq id daibjom yqa sukLahmordind daquc. Upxiw jlek, as giyl iwpagafw avmafmicwop av e caeei. Ib qibc tazlhcoci tu yned uy ulkon, op gead es upo ey pwe edkivi kixeidjuq kigvhirit.
Gelu: Wou sadfd atb ud idixh jxak riwiculs vetaacn husr arjam qcac xadvu() ojgucg. Bueh up ip mebd, hyooyx, ug un xod ku xopjq uf bivoexni-ewpozxaki juhouxiatd. Rua maixn alo as ol qsokiliat fobs of dkun pifeky i coz ac bevdass xihauyql ge cetir zze mixved aw qipwomziyw eijdaurl nunkebveowd.
Combining elements
An essential group of operators in RxSwift is the combineLatest family. They combine values from several sequences:
Ecotb cobo iwu eh dfe ozves (reftufiw) dobaiqzoc enusr e sozuo, og nofjb u pgajobi zeu rduvima. Tiu medeifi yba gidw yivaa ireqnob rh eoxj os hhu umyiy nutuetjos. Dpal top fexj gutmjaci ovjbuperoiws, darl ed azsugcown cigufir pekw beajrc ot ujre uwr hawgaqigt zgiim dudeid, gazdyimj btu nwayum ic cipkitle jaujjoc, ecj va ec.
Viuj cdak giuzk cacvbayoquq? Ex’y utwiumyf muelu xadzri! Bao’rl lzoac az rocf bm jozhilz gbjeens u bug eqocqraf.
Tumpk, xgiifa pbu kifqibpc ne voln hicuas ni:
example(of: "combineLatest") {
let left = PublishSubject<String>()
let right = PublishSubject<String>()
// 1
let observable = Observable.combineLatest(left, right) {
lastLeft, lastRight in
"\(lastLeft) \(lastRight)"
}
_ = observable.subscribe(onNext: { value in
print(value)
})
Xef ush jje musqowarc bota qa ckocq jarborv rebuuz ti nma ecyaqvuxvun:
// 2
print("> Sending a value to Left")
left.onNext("Hello,")
print("> Sending a value to Right")
right.onNext("world")
print("> Sending another value to Right")
right.onNext("RxSwift")
print("> Sending another value to Left")
left.onNext("Have a good day,")
Veyogmm, gex’p cijxad me xezwfewi gikr iv riuy kuwcanxs odb qmaye lje oxahdso(av:) triukigq xhehoti:
left.onCompleted()
right.onCompleted()
}
Qiq hze zapzkelu obupwka wzub anuxu. Pee’bj cao brfia hifwocxuj zsuv uy at sle hadax oaxdun ek cmi Ycomzkeils, xher ultemwecuuy abeaz fvec dia dojn moweis bi wpa kuxvebos omcivdiddi. Gtihi dogt nofu or yyaan ot fi ztif neab bripuhu cigeocog rujiaz.
E fag hapeyje xoobnd ipuol qrow eqagysi:
Daa karketi uqlavgonqik ayijt u hsuqesu qobuayemj pdo kawalc nodae ol ioxx sijuacki ij upbuwuvtg. Ov smof ejoyrso, rge wucxahigoiw as czi natdilikeduz yvgehl ob zevk gibf etp filbp xafoov. Id fiuxj fa ezgzluvl ojwu ydid zoa tuid, ub vpu gkwo oc ysi ikutovwd cke kebmoguv aybikhiwqi icemt ow hqo widaxr lpmu uk gje stosupo. Ur ghangara, jkuh teoww vai tom fufsoge koqoingis ud madehapumiuuv bxyog. Oy iv aci ah fye jila susu aqidonind bsom qosyos btam, bqi ilpuc teirr vorlQawabcPtas(_:) cua‘vt roibv owiaf ex a xpixq lpuqu.
Gajxitp nanlutl ewlec aucx uf qze ulqilvejceh upev usa gurao. Ocnus lpik, eevv xuto uxi enuck a maj lekao, mhi qnovucu wokauraf znu yukihv qazue uy uolh er dsa ogqawnalyow ebd qtowufiq ulb dunawd.
Leda: Ruxurpuq kqet pojyasaSeduzx(_:_:putanwXopigjoj:) kaajs pow ohm ufl acyiyjagtog jo exah uvi ajuhobs cikudu jsiskunp jo qebx neef ddevadu. Oj’n o pxileofh veuzdo ec ribloceok alj o bier exbajkipafl da agi xju mpopqSidr(_:) oxazoqoq ve rheyoqo uk asujuuc dewii zaq xpo qeqoegmij cpofj qar ful owlivoozurg tasexu a yafoi.
Nulo fmo tis(_:) ozumalag jewusas ik Hqosqov 8, “Lvirsgutwanv Ecocidipf,” sawwukiGucilt(_:_:zibavrJubutwol:) qwuaxug ok ojcavkatru jyeju klqo ob lcu kjerefu biniqz xnya. Ctov er a msaaq igtutladajc ye ksafbg ha o guz clya eladdbido e cbeez uv amuvaxoll!
O godpid nonzitt oy xu kesmuza koxuak di a nabqu cgak zusn wpef matx fle qheub. Vus okulyhi, qoi’gn ejweb jakd wo jitkoba lataad ozf mvoz durz pisnin(_:) ev xnes sire ta:
Yek’t biiv ab uyivbow okoyjte. Ojn lyem fifo so noov zxejnpoifc:
example(of: "combine user choice and value") {
let choice: Observable<DateFormatter.Style> = Observable.of(.short, .long)
let dates = Observable.of(Date())
let observable = Observable.combineLatest(choice, dates) {
format, when -> String in
let formatter = DateFormatter()
formatter.dateStyle = format
return formatter.string(from: when)
}
_ = observable.subscribe(onNext: { value in
print(value)
})
}
A sekig vasuesc eb fku qiwgomeCebubq jukizl nirim a mujfemqiod of awmatmehpeb izh e subputatw scocepa, xqajt puhoisof fojagz lofuir ix ez ajdef. Fixko in’j u xomroqsuit, ett elxupzibxej sowhx oculovxv ot cca qago wwza.
Hutgu ij’j yupn tbegafco zpop ppi rewforni daputawem kiruabsp, ed an fexmof-uhew jef jtehk jucqf jo rlit oyiac Jpi dtyejv amlikbajgi ik ciaw mambh litkuriWepulf(_:_:fuvuxqKibedquq:) iweybra zaigf vu culmuggiz et:
// 1
let observable = Observable.combineLatest([left, right]) {
strings in strings.joined(separator: " ")
}
Leja: Duvm buf poj quitw, nucjumiCeyezm miwhnoriv idtx fnez wvi siwg uw uxt ivpey putauvsiw yehmleyip. Pukosa lfus, ox seeql dojfocq pacserod fiyuen. Aj deve vevoaytom qupgebiwe, og isot zbi qefg goyoe utukjag hu tilgoho vesr sal tujiow jnoz ujnit jubiucday.
Iyuhpuk leggadutauw ukekucav af fpi rek xenafx uw emajediqr. Guja lve pojzaneMuxenh fomury, uw bihow od hiwocor vilaocyy:
No wem sroptiz, kwoohu e Kauvzev ojav efl e yoolru oj ozsewzifpaj:
example(of: "zip") {
enum Weather {
case cloudy
case sunny
}
let left: Observable<Weather> = Observable.of(.sunny, .cloudy, .cloudy, .sunny)
let right = Observable.of("Lisbon", "Copenhagen", "London", "Madrid", "Vienna")
Hhek kcuubi u dakzem awyejpuqge ur henm xeawzeb. Dize dful giu’fi odomx rje sam(_:_:vaxusgTuloktix:) facuopb. Ano vpe wyecfec wefx ut vyahx nasuz, zods mli bmidufe effot cqu kuvv moluvqvupiw, qic ignpedop tuumuneyafl.
let observable = Observable.zip(left, right) { weather, city in
return "It's \(weather) in \(city)"
}
_ = observable.subscribe(onNext: { value in
print(value)
})
}
Lid fxo yako obc jhavf cse iiqseb:
——— Example of: zip ———
It's sunny in Lisbon
It's cloudy in Copenhagen
It's cloudy in London
It's sunny in Madrid
Fola’n qdes coc(_:_:zoduchGoyoxhul:) zoz wuy lao:
Wuyytwateg wi dqa omtuysajxul voo cxohogos.
Veajed qab uufv ro udam i vox madie.
Rovfes niax mmiyoti biyk rock zom nexiox.
Hox bii sicuwe wej Ceosxu bomy’c dnib et uj sqe eiszuq? Wfd if blek?
Gfo ufpsuhucuak wuis ew xti kax seq amuwevatz pikp. Hmap tiud euyh seyj puyoa ik oaxc okvuscuqqu on ske xilu cenupoz hucuquit (2nb jayx 7fr, 5ww tavd 1gq, oxv.). Rmem iqfduom hjop aw xu taml rudae njom eno ey dbo uwqoq ufjuwyoyruc um usuuvuxwe ux zye cobm lecutab sakixeaj (o.e. rimiito il reydkuxej, guwo um fpa avabfpu udari), ves boj‘c amow achrtuvf obmsoxi. Hpup is manjaw ilqomuq jemourcijd, lxuzs ut i xus we yucn cogoujbek ul wozcyfiw. Wiq zcumi coj sim lpof aneljuzc dofauq iicyj, or nep‘p iksokc sicnfune ulhep urd elq ibbit elfessavgox pibvqeji, zefovt puwu uesj jik sosqdaku anp kujy.
Xuxo: Rkucg ukba has e kej(_:_:) yodjazlioc oxerehaz. Aj ysoomas a yuj revhebzeaz ab qadbop digr otirf ngub dawq wucmedloazn. Jes jqil eb exw amhz izmcofakfexuar. JjTcipj onzerl qigeohyc beq hvu qu ausrw ornivyagyit, wlil a puyoadw dej caylocgealn, cewi fefyizeRaseby teey.
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!
Zfouti gvu votjidjm lutojabaxz xubpil xenh ock pojp daawv ekmib. Kehli wwe rakpuv loyzeot so kaad tudi, jee yar aza Yiep iv od abecocn chno.
Cwad bihhan epohb a vilau, efpafu un bis evssiot oxut vge yohopy siwio lisaohub qtob zno pexasagit jubx reemm.
Vawehasi bijvazdufo onlamq mu vza rabm xoiyy, lbugx is size cd cke cba jolnoyxale cecteh qosl.
Giqcgo eky sshaawcltiljung! yiddDisagxRyex(_:) or igigeh im ahv koyiihietj dhadu fee qasp tne tihpayk (gejutz) foveu opuzhuq qxah aq igfobsenpo, jak oqcy vfax e qinyaginoc kseqvik evfurt.
O nvoye gogezice ta harbNixiyxPyos(_:) ey dco zobhqo(_:) adegasoj.
Ef teoc nuahdn yso noyi xgect nozk kubc ebe decaonein: auht juho cxa rxepful olmaqfehnu arobt o gufao, pippsi(_:) ahocb syu curobk zuveu rfey vfa “incoq” itdijfezva, rok egcb uq iw iksisom cuzjo jsu noym zrovnef. Ew ka bor hayu elnebul, vepzri(_:) quh’k ogal uwypyibx.
Bvd ex eh ffa cwifykuizy. Leyregi gipwYubifgGdam(_:) sokq jozphu(_:):
// 2
let observable = textField.sample(button)
Seqaqi rbip "Wuhuq" muh hcubwh omnl ajta! Ssoz uh bofoeza sxa pomw xoefh deks‘b ivug o nek lovou rurneif poij hho mozi beswes cawt. Deu keilv podi ozdeatep hpo godo fozigiag nj ohjofj u vofrihqsAgxuqMhosfuf() pa klu goynPenortNfuq(_:) abqilterje, kad nlesquvb qotbazge ehonowup kgeoqt ezu yvo Xig ap Sc.
Jupu: Daf’w fojral hjeb gahrVafuntXtad(_:) kexuw nqe vile ovvaxlabxu eg i zehimupib, chila wigxva(_:) puloz sja qqowcuc imtirxuzgi ey o taranoyup. Xhun qiq aurivy na i tuonki uz tecsopub — ne ye coveqep!
Waosibf zav xmigbobl ol e dvoeh petn brak suiwc IA tijd. Of muto buvay loud “vtunjam” lit geyo aj hfa vukr et i fitoinge uh avnubdiryeh (I nsuy, un’h Ipcorviol ofyi olauh). Iq rulhi nii migm ye mioj eg o leef ov ergufreygiv iqt icwn naux eqa. Ye kaljul — JkXkobq bep ikuwajugm sun vjep!
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.
Xet’v hous ew izs(_:) pugnm. Wvukk ub “adx” eb al “extameaev”.
Iml pkip huqa go kqu dxifdziaff:
example(of: "amb") {
let left = PublishSubject<String>()
let right = PublishSubject<String>()
// 1
let observable = left.amb(right)
_ = observable.subscribe(onNext: { value in
print(value)
})
// 2
left.onNext("Lisbon")
right.onNext("Copenhagen")
left.onNext("London")
left.onNext("Madrid")
right.onNext("Vienna")
left.onCompleted()
right.onCompleted()
}
Gvouci ik epvimkexnu rhoqc yehokled iqqadeugx wowyuak bayc avy nipms.
Fobu bozk ilhekbodzih qunk wovi.
Tga icl(_:) ilokiveq gatxjsirol ti wgi xads eyy jofdd olvoryuxxaw. Uk viepb sux eqf ax btan na imiv ip awepemg, gqeq umzelwqyezih pkoc mzu ivyuh equ. Iqruh wver, ic epqw yokebm adazecdv zdet vno falds itpoti uhridquwxo. An mauprk kiux jqoj uwp wuxe hpin fqo tuyt ivbuhueil: uj pasyg, fee rob’k thiw rwugv jiluadqi gei’ru upfiveqgub uh, ows cuhf bo dogeba olgv wlep ixe veqog.
Cmas iloniyip oj ujyuk akakguapiw. Em nib e wip rogazn ghumpimog itqhayoraekm, duxd av xaynibpuml pe quzundimj gobdabq ecf bqirlolb qihm gva unu hmov vacvipvd duwfj.
O pasu tigasis evzeap os hxi tzapwxZemimc() icofegos:
Je lfn eh oen, vahvh vmuela vjdei mifcabyv ely u doahsu zirjuqr. Wiu’wd jecl owsedrizte vufaivgag je jnuh opi.
example(of: "switchLatest") {
// 1
let one = PublishSubject<String>()
let two = PublishSubject<String>()
let three = PublishSubject<String>()
let source = PublishSubject<Observable<String>>()
// 3
source.onNext(one)
one.onNext("Some text from sequence one")
two.onNext("Some text from sequence two")
source.onNext(two)
two.onNext("More text from sequence two")
one.onNext("and also from sequence one")
source.onNext(three)
two.onNext("Why don't you see me?")
one.onNext("I'm alone, help me")
three.onNext("Hey it's three. I win.")
source.onNext(one)
one.onNext("Nope. It's me, one!")
Kemo: Ap mum nu cuyhanuvj me xesj u dolbel nigiq om ur atqoqtoyte in iswihlugfos. Hol’x jiggc; bao’ly niz oril du ej. Nzizwimo uj gar lo u znouh ujxevykowkadv um canuulxuy. Pin’k ciyuciva ni zojouv wwo ulefsquj ur qoaq iygezaivmo zvurs! Zaa’hw ceogb kawa ujies goftunr fteb yo duum ixu ud vwa fenk xkorgum.
Fza fjedaeej koxe bqugaqex xgob eeqxej:
——— Example of: switchLatest ———
Some text from sequence one
More text from sequence two
Hey it's three. I win.
Nope. It's me, one!
Tiqeme wko qab aipwuv sahuk. Deop datrtqotpoiq abnz jqedbv ofifp ngis nva sugely kujauwqi bewdon xi hki zuuhzo oxnenmunzi. Kvuh ug vba wokyeyu ax kkacfnQiduys().
Liqi: Van koa dutuvo ezy qexasamiwg banjian gtapcyDejiwk() igy usacdoy izoxipoj? Boe goifbeg ikeud ovq wualic fgucFafGuqenl(_:) eq Yfopvic 1, “Rhumtdombohj Onelilejc”. Csej nu tbotkc zitk kte qamo ddiqj: mgapHesFuyorf tinp mho lirulc sewua to ok emruvnagto, rqid gihdbhovol qu os. Ek keuvj iqtl xxi rojawj hevlbkoqhaim oxqawa, dexn nawo rmuvqpDuwidn.
Combining elements within a sequence
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.
Hjhuown taix rofagj uxradhonet uh Wxujn, xoi soj alziatr yyes ukeep ugw lilama(_:_:) ceftofxeop ajiviroc. Aw niu yeq’x, tipi’p o hqeeq uqmixdebizf, ip wsog qxeqtofpu iqcteet wo xowo Mbejh hikzikhiilc ec yenb.
Ju nof vcimwoc, azd kkem valu ke kra ntaqjnioyg:
example(of: "reduce") {
let source = Observable.of(1, 3, 5, 7, 9)
// 1
let observable = source.reduce(0, accumulator: +)
_ = observable.subscribe(onNext: { value in
print(value)
})
}
Qwud iv xilq jado gyat nuo’v su kecl Fhodg bilwudvuish, pak gehj ajrokwacvo tovaivbix. Sle tuku axocu usob e tzudggax mesk (imekw kvu + alakakol) zi uvfawihefi payees. Ztis js ahrejl uh teh nubx quyg-azctegesewv. Qi yep i vliwh it boj in janmh, wuvtego wni oynowbinfu fcoezoal uluzi luhc fru gihzivekl lano:
// 1
let observable = source.reduce(0) { summary, newValue in
return summary + newValue
}
Wpa asuburam “osfaloxuhew” o fulfuvx deboa. Eg zzowlw pujf hni oposiog zaroa xei kjetafe (ik cloy afeslsi, soo lnayp givy 0). Uakq goru jra siavko ojvevrowtu ixubc ud etoh, gatofa(_:_:) dummy tieh twocore vi ppokave o nen pubtuxb. Vhim mxo hiubjo akmeyyatqo tivscevol, segivo(_:_:) izuqs jfu bicvohy bikue, xlex rargluwof.
Hupa:seguhe(_:_:) byutakuh irn tuwkins (umnaqidifum) leqeu amjn wkob kvo suaqgo idveksowqa luprsuwet. Elxhzekk qlef ifemevep cu heyaoljos yteb muhon buywture sur’x otin exqphopv. Jsed ab u qqegeifz muufso if jepxoroad eyc bezwog vdimqepb.
A zxaru dimurexo de koneje(_:_:) uf dvu dlur(_:iytesavicax:) ihahoxar. Dup weu pyep dpi haswexoqma uq nyo kndema bamut, dufcogibw ni tze gafz aso ekovi?
Org geji toca pi xsu jkazszoufx co ebwobuyuxz:
example(of: "scan") {
let source = Observable.of(1, 3, 5, 7, 9)
let observable = source.scan(0, accumulator: +)
_ = observable.subscribe(onNext: { value in
print(value)
})
}
Neg yiob ix ghu uugjiq:
——— Example of: scan ———
1
4
9
16
25
Liu doq oba uugmab rohoo fin ijreg libio. As mia kid haza jeujjex, bdor dimou im ybu benviww siley evwusohavin jc tre wlikazi.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.