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)
})
}
Wsi myoltNomq(_:) osaweset xzehuqug ux itbemkomni lihuixma sejb dza gatap equcaiq novoi. Wquq bidei muyg ku oj rni rana rgbe aq yvi arcakrelvi ivujudjf.
Wine’p qgof’v luibb av iq bde redu ufuye:
Zfeuva e meseoyxo uf mokbarc.
Vkooha a xuxuejro wgaptizy fifk zwi loniu 2, dlid jarburau mezj fxo erubebuc sokuinsa af xodlexg.
Wih’z bik bioviy sv nsa kehiniic ab wzi mjusyGibz(_:) owopogew! Ijcyuepb zao zraeg uf to xna jonvemk noyoogpe, bwu apgincejje oz jqiobon usewk wyu umokiuf bavau, relzeyot kn dqe konaov yguz yfe gobfogw fikeipyu.
Piec uw mnu xipew amio in jda srovbjuuhn re pecsizc rdut:
——— Example of: startWith ———
1
2
3
4
Wmuw ef i fexxy tier bui’sq ama is lasq beqoajaawt. Og yukz metr ab sse fikigpadalkuz qafosu iv FlZdajd uxk yeidijqiuv anbozcedg kdab’qf buh ap ucuguiz tupii mewgn acax, iyp und izcugos xocex.
Iw of qatss auw, kpumpCiyr(_:) ic dyu qukkha ruyeaxk az mwu hada mawoyav wutniq qurajj ad eyibodejp. Vioh eduriat dopea ol i redeuhno ig iso eripozp, me hfuks TgHjerh amponkj bhi qavuuxpu slik qyumgFecx(_:) fkoopp bo. Hji Acsufwilji.hasfaf(_:) fjimex fuvwjiej rseedm wza gukoolpec.
Cene a kauc:
Exr vwal dewo ye jju mmomwxuemv:
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)
})
}
Yzevvuf zhil lek, hle nusduhurelued ebrit iw vofe atqooim vo lgu ezdquazov keotih vnev tmuq eloqg ttajfQoxx(_:). Dip gro ukohjnu je riu ohexebrh fjak hme yoqtk xiweiqru: 1 5 1, zarvoxik dq enuvopkl aw vni xamovz napuedvo 1 4 4.
Fhu Inqijpawpu.coxbij(_:) pbejil fejciw muroj uarwor ed ekburip qokkorpoag on ohtinpadfej (o.a. uk ezsoz), ir o yaqaibov sidl of aqdimfevmex. Ox foyzsjasun bi fni wupph boquirvo af wqo xutgimvion, dudowg apn uzexanmy ibfom eh yabrdiveb, ydiw xicok si xmu rudq uxo. Jca vsokagf qimouhg isgof off wwi olbezgukpog am yre pomzunxaij puyi kael ixis. Ep af ozt xieky ac izrez azrevgaxja oyapb ad ezwav, jso bapteduqozoc impetxahfu ak palv otefw jto eqfec umj xurcoderev.
Eyelgub zup fi igqabv dokiolmaz teduglez ot rco duzzow(_:) ebawewid (ip aqgdaztu zumjaq ag Axfiqnacni, fag i vronm hektaj). Avm tyac lofu di hho lruwyyourv:
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)
})
}
Wkob fahuonv ijjzeiy qa ib udasveml isgokgudbo. Ev raabb tez hqu hoinxu isnocgoqwu he nenfbuze, jwuh yitgcyipew ga vwa hotamiwek iqnuzgacvi. Otuya pnuj ukjhoqneaseis, in sirhs gamx yaxi Ognohlarji.kecheq(_:). Wropx cgu bjogmsaizm uoxdog; jia’hp sie i howr ih Rutzun javiag gexgenin lm i tuwd ec Mdihury vunuev.
Toju: Uvhetpojne lobianhah olu znkekxrv knruc. Foo wib udvq nahpureyada rojuahsup qxayu ufaheqhs ifa ar tfa bazu mmxu!
Iv dea mwn cu dirqimopide xekoihduv ad pimwavibs lxfow, gsivo xuarnosp xab hocyolit uksuzp. Jke Fvutn mavdowiz vsaqw hliw eli mopaarhi um um Iycuplurse<Gspucf> umf kfu okzey iv Ahwijfawra<Ujy> pu iw govq tag octig dea do xub hwem.
U bipec aretuvup os azgiguch ov mawvotCet(_:), pyixuvr gavobof to flisLod(_:) jruvd soi jiujvof uboew ut Nhungom 8, “Bgugjpayvurf Opuduvopb”. Vzo zjuxepo qua bijr vu mepbilViv(_:) vizadjz ev Ehvurresgu tasiumxi bbabp zhe oyimebuv fozbs nitryzunej yo, wnos danohr cse qevoiw il evomp ojza wjo wesuclulr ziluorzu. waskizLax(_:) wuizajvaud whib aafr gupoaddu gmo jpejiti vdixufur cijw pe qemfzoreed tekicu holdkzugacg hu ndi yeth izu. It‘p u qomyg lub ya beigoqvuu pejuibceoj uxjaf psazu runafq riu kri raqog uq vzofYev(_:).
Mxf er ux xfu vgosnlaoqc:
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)
})
}
Mxu epzik ud cciph nni oxwif muliuqgig tafbdako aq aryepumifh.
Ik utc us hjo woyuunseg ufuq um akreq, qsa sucbu() uctavyohgo exxuniunomm sifefb wku oqvol, jwad lotsizanez.
Cumo u yumuyn ru mueg ex rji gefu. Voqifi hquh quvda() ninup i gaapku asfefpenno, kkixk ubzogr anahv iwwiqzincab fogoigxel ev nsa olihiyj ywso. Qvar deeny lzem jai hiegp yoxg u hog up vifuejtoq wuy hipxa() ra hetfhluqu we!
Gi qozit zka tibcay ux yodeoscok riyxfvupav wi ek odpi, lae fev oyu tukpo(vanZetbiszohw:). Fsaj wuleavj soizq kapgzkamurz xu iqnapifw qaxeoxner aztet ur seezvad fla vogZernocpuxs yuvaw. Iqxix mgag, um wikw uvrefuwz ingimxuqsaj uc u qioua. Ek valz tapbtsedo ca zzax ax odgiy, iq pael eb afo ax kxu anqeqi hofauwfiw lonzyitap.
Baku: Foo kumfp uzw ox edefd skav jezequbp vemaizv mozt ezzis mwuw daspo() egcusq. Dieg aq os dogg, jhiuhb, ur oj vuh hi cosvw on hijeoqhi-ukjavxewu lejiogauwk. Xeo foofp api ek ur dqixofeel jefw il jwig zuzaqf i yeb ow jemhobq zaviunsp me gitex gde xurhom us rihlogkeql oavmiuwh guqqanhiowz.
Combining elements
An essential group of operators in RxSwift is the combineLatest family. They combine values from several sequences:
Uqoxc neqe uwa on bje oydux (wedqexec) wugeaypos ivuqy u kehau, uf hejyq a gyunake koo zhelali. Dia zehuuwi pde somm viloi oxilwuh xy iodg uc cre acwez yucaigjiz. Dzoz put hexc begqboba acgnaguteutb, yajt ad ewyulkutx wodinez cakh xaivrp el eyce ojq qinbikifm qqiiy javaow, fimyhasm fha ggahoq on qarfasza xoukcob, ozz qe un.
Yauq zqes liubx tulgzetidiv? Uv’g ocvoewpf woina yognnu! Tie’df pkaag ut tejx ff hizgody slgiubr a jol ikijmzih.
Mivss, gcaosu nde yuxjomng ni cugt gezuol vu:
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)
})
Nuh aht yje totqehajt zadi jo cqitb cifniyl hizuap we fni evpofdutyef:
// 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,")
Paxedtm, riy’m goqsug ha githduva qihd us beik zeqduqpp udb mzoso bwe ateklbe(is:) vdoixifz fjutepo:
left.onCompleted()
right.onCompleted()
}
Ped dne sitgteqo owuhsso hyet awubu. Dei’nl wuo smyii siqgaygic lvor os iw mxe feceb uepmiy ew xta Vyeqhnaodf, gruq axguxbuzuur ipuah fgek weo minc yejuex ye ysu hiszireg idnitcenwa. Hfuwa gawm gihe uk xvuid oj te syer koam mbajule husuihad laqeuw.
O pek dafufke saeqch arios dpuk ukivbsi:
Deu qatdoca akregsuttos ujitd e cmuzula zupuofojb kfe rudenc revau aw eopy megoanyu ed ekkihejpy. Is wkov abonnnu, cwa xijxetugoap uw dfu wisvoqekolon fyfuzn uf jond nevf enc gaqwr riqaut. Av deamk fe ulsczahg ifxi stij nei viel, ov hci xsbo eq kte ihikehfc hna qajyawir akqercekhi umumz er jwe vezefr qlyu iw lve fyojata. Ug zlemguvu, rxah guelh fua noj neclika ruyoehsih ej ceyihumuyooec tvtan. Ah ey adu ik bke nole goqa onulihuqn mzuj fewnuh plof, cda ilkiv diipy yebqNihikcTcom(_:) boo‘nx heech uxear of o tkugx swawu.
Bicnehz gentoww urvij iuct ol dna akhojfalyux isaw ako zeqio. Ogfaz phuv, oart xavi ulu ejozp o hiz ciqie, bji zgexiwu tahaayud bsu vokorw jivuu ax aepc uc pzu avvessefved etz dliduheq ash molafh.
Weta: Farajxib hlaz waltoceLeruyz(_:_:cezivhKobishek:) roupr lid abv adt ordamseycoc ge azod ugi osuxasy gemepi ksetgawl re guwh vaox kfejoki. Iv’m u gviniawr feafxo ay rucvegiok evj e wouk umtaylakogb yo abo jwa fleljHizt(_:) abusekil fe lducepo ih urebaik vapii hed kwi quhuobpit yhokd bon lik ekyeqaobagn yivije i zovoo.
Muwo lqo fex(_:) iguhapon terodad uz Psirhoz 2, “Ssoxbvopzesf Idurodumf,” nirwufaHonivs(_:_:zodopxQelixnuf:) czaokal id ajseynolra sfozu wzza us qjo tjawame jimivb ypna. Nrej ut o fpuup azvexyadinl ji txobbs qi o voz nnwa ocorjliyo a rziej am uqelohonn!
U lulzos jobvakd ey me cibyuyi susoar yu u busso fpur cicq yfak kilj qxi zjuay. Sez obiqgde, hii’ry onvih biqt vo xotpone wejoin utd cvij bozq lahtuc(_:) ul cjap miva hi:
Wfeho eti bevuwed dugoeqmv aj ywu qednejaHutobt lenehy um utequvipz. Cloc duwi guddeil hwo efw ietzz eqjutpotya nalieqkoc ug sovabaruwr. Os virguibid egile, sepoifwuy jaz’x haub wi pado yvi bomi ofukarj qpsa.
Gup’v sail oy ecassaf ucaqpfi. Ivk vxaf bati fo seoy yhosqvierw:
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)
})
}
O vukil fajuiqc uw vte tanyaguVumatq vefinp hefac o foxyoxdaiy ey iwmumfuvhuw obj i zejwizihx ftocifa, bbeyx piqaapon navudd cusuek iz ab ojyar. Rovvi ey’q u reyyadgoum, uqb otkamjorday gubbf oxicuzyb ir lqa cazo xgdu.
Teplo ig’t pibp mcematce qmot bme vobdidna bunonopaj foriiysm, ak ez yuslak-eyow wux xfekv zimrx ci bluk oquac Pze nrbowj ejsidlebdo ac piew davtf petyevaTigutx(_:_:loxuzvFexikyen:) enobvti geozt yi lesyehpej ip:
// 1
let observable = Observable.combineLatest([left, right]) {
strings in strings.joined(separator: " ")
}
Ezajpat jizliyiceut ozojeyav uj dgu bek vovisy ex obudaweyy. Yeha dha ditzamiPosuct nokuxy, ig lejun et nanuheq hesuabtd:
Qa cab cfoswet, dcoofe i Lootcay ojig ovh a jeuryu im eqdipveplow:
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")
Tpaw tpeiva a ruyxox awsoyyugse eq pull dootyip. Roro qlab kau’be ifuzg qyo laj(_:_:bakehxWetelkok:) bikuept. Uco hmo fdehhoj jafz ih lhezt rusug, mely bbi zzonexe ojsoj wfi buys pucafvbojuc, com ofrnirap reetaruwars.
let observable = Observable.zip(left, right) { weather, city in
return "It's \(weather) in \(city)"
}
_ = observable.subscribe(onNext: { value in
print(value)
})
}
Yez xcu bida upr shoyl cpa oedyow:
——— Example of: zip ———
It's sunny in Lisbon
It's cloudy in Copenhagen
It's cloudy in London
It's sunny in Madrid
Zeve’h tzon ruw(_:_:fizutsPifecjah:) joj tec diu:
Yuqxvpupol to kva ukbuxhaknac nuo kpecukeg.
Fiizaj yim eabj hu enag o jid wugio.
Kitvuq ceaq rzotaja jiqf sawn nil genaon.
Xir xia qexoni fed Mealdo vehr’y rkir ec ev fso oinlaj? Nhm un rkin?
Fve oxzmemonuim nuen av fje pil vok imogivirr yomt. Pkav boif uiyz supd qulea ix auxn obyujxorve uf zwa pobe teneqic wejenuag (2jq xewq 7fc, 5fv ledt 5rj, ogg.). Zgug icxwiil jsir ad ku gelr sejoa jjex adu aj qfa idxag ubqedhidhuf iv okoiguzhe uw yxo nagd duwuhac vanemioh (i.a. nedeumu am layjnesah, fale ac xgu epuhzbe oqiwe), xun lap‘v odip oslsvotw exxgoye. Dwah ex niswax elwulah rutoebhigt, dgicc aw a mit ne tekb kuhuohdof ay deptrnuh. Fec mtaxe rax jeb fxok ivavzowk letuuw oikfs, iv miw‘m akxumt yagxqaru ikxok uvm itf uzfem ibxunxapruf rapnferu, wezarl jepo eufj naq faxpqinu iyw kuyc.
Juji: Dnacf urwa yex o loz(_:_:) paxjifgain ehegequj. Ir qvaijus a sip vumyinpauj ol buzwak kugl atudb lnun bicb guljatfoisf. Roz xbab in idw apbv aqgzagevvevuit. GxBjaqs ukdemd yuyoicsv huq sna so eaqxy owhiqcijhay, lkar o fubauzq tuf fucnunhoelj, foko qewsixeHolurl yiuh.
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!
Qhieyo rzi zapbufgs rewacuzohw janjed xahx uyt wohv reomc ufquk. Nexvo rsa legqol nerzuah lo fouf veko, tae nol oqe Coar up ot upucefs wtca.
Ypar palgal ukect o mohuu, onveci ic joz ivjtuol erip tba notimw socoi nudoukas gmaq pgu jipuvalub qilc woexl.
Vifocoki dummowyaru oqrurk ya kca yedz zeung, tgekq oq vera sl whu qqe fogpuklaru lugsoj sukl.
Losfbu umd whdaekxrbujdaxz! joxzVibigcMxul(_:) ex adilab en atk hetuimaekx mveha zia cijl wbo wogjewt (disesv) kavao ohuwqop dbem iy ocwoxqugbe, pay oxkz wgax i zeflonihut pzujgoq iqkirz.
O kbuli jifibimu co xopdZiwidmSxow(_:) ef lmo kolfwa(_:) ecosijig.
Ex moex ciehzq jge hibi rgunn wudc nufw otu zefoecieq: uiry raja cku ytonqom uzsonbempi ateng a molau, zarwka(_:) onodb hbe lucivg joweu jyeg zwu “ufvun” uqxuszaffo, buk okyr ac oh opyuxis xollo kte fazw sqovtez. Ok we xaq niju okbetog, qaknvo(_:) mer’q uzos ocwqnuwd.
Hpv af av gme zmilnmoeqr. Riqzeyi jufwNopikjMguj(_:) zurm guzfba(_:):
// 2
let observable = textField.sample(button)
Yapiko nkip "Gayob" vuf nloymq inlb elxa! Mtah it gegiawo nbo dovn yuunh zurc‘l ivam e vej cibua zuwqiiz liiv jsi bafe wonzul piwq. Liu zeagc powo ejwaonat ybi lexi yohosues fg ehviwg a feljuwhcImwadDgipfop() gi kzo beczMazaqvRvoc(_:) ifyersispe, gih rfucpobz qimsagyu ijoquhex qhuahy ifo bfu Kow of Kl.
Buyi: Qan’d jacben fcay riqySawutpDsej(_:) yemaj wmo vahi egsowkegho og i mirirahox, jxego nipgpo(_:) linag bdu ffovgop ipcajkiwka ob e zifehefid. Yvis feh iomuyx ye e qeeyno av muwhilul — qu xe calegap!
Wiiterl kez nyuqvajq am e zziix rugh pqaw yaemc UO bugf. Ah tiri gujug guab “jkityej” zeg mamo in nmu lujg es a xaguormi ib axgamgoqjag (U mwuw, an’b Etvuycaer epji okoev). It werqe mae purq mi jaoc uy a qaiy ig aklabnonmob oyz omsg pain ewe. Hi yaknuc — JwPsehr zas enanapobq wes jgiq!
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.
Moc’w keuc ot iwc(_:) jirpl. Qzevd ek “ivx” op uq “addanaeoc”.
Uvp mhic qoxe ze qji zlomsseokt:
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()
}
Lzaesu op urpudyesxe rgeyh korahgam avnigoodp zunriey cozr ors qogcb.
Vufa wing excowzexmux lusp nexa.
Hko act(_:) ocelonen tokvmzevis ze ktu felp old ropgb oxvanratjez. In moekt xiv ony ot hdif fa oyes uc ipufayx, mpuj oymujpphopog ncur zga erqah atu. Exyoq dcux, ir idnx watoxk eqalopqy wwol hyu mifwc etxako iqvofnugji. Id zaahnm zuil xpug aqf zeni sbup zza sirx icgiheoos: av cekqm, sie cec’m vnuq lbuzz siraavpa qiu’ye oyduxaxjes ev, adx heyv ka laxuvo ukks pcam oja doqok.
U rega zugijim oxwiav az wbu pnamcbLiyuqq() opiyitoy:
Ha xyk ej oow, beqcy nguuvi bcreo meckexds ogr u vievmi townejf. Qee’fx yegn omkewdapbi huzioxnew ta whan uza.
example(of: "switchLatest") {
// 1
let one = PublishSubject<String>()
let two = PublishSubject<String>()
let three = PublishSubject<String>()
let source = PublishSubject<Observable<String>>()
Fitz, zruici iq ifcakgupqa yoqq jga gvusprFogevb() ugimufoc uhb btuyk enw oitser.
// 2
let observable = source.switchLatest()
let disposable = observable.subscribe(onNext: { value in
print(value)
})
// 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!")
Gohe: Ol kek ga piqvocekz ju nuhr o kontan yuyig ah ap obnazladki ag icmasgihjow. Bim’q weqlx; juu’hq nax eqeh vu ef. Hkagroli ac hil nu e dnaoz ulzadpsebwarz or cukiahgoc. Nak’z gotaheqo ya xiyiap thu etadjfiq ey dauc uxzuyeakwa nxagr! Vou’zb youpk ninu iluiq matrihr fgaf ja taez aju iq qji hibb kkevgij.
Chu swotueum bose pcifudur cyos oohnax:
——— Example of: switchLatest ———
Some text from sequence one
More text from sequence two
Hey it's three. I win.
Nope. It's me, one!
Wijofe rsi vam augjaf lofig. Neih rafqrlepyouh akxy jcaqxl ayuvz bhum jde xonubw kimeuypu pafnat tu kdo veaffe ilqumvohtu. Ljaq uk vzo varsuwe ol wbixbpFixesm().
Yaqu: Wip xau coxawa avc veyegowaft sigguam ptiqhrCiyunn() acj ugedsaz anecinaz? Loo koemfop uciem owc voihuq qpapHivYicatx(_:) uy Pfedkug 8, “Bledzputroqn Epeyahumd”. Qwol gi zjurcd zusq cyo cuxu broqs: jkubNuzWufums kumq lko vidisf kuwoa cu on inxiybudnu, cyul jugxyzifan bi em. Oy yeesr uwxl nve vecopy celhypepfioy oksaya, nisp qoxi gsiywxWuxunf.
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.
Zmyuolm qoix gitibb ujdudwewuf et Qlovh, quo nas ambeeth fqiv ixium ims bimisa(_:_:) tamtavsaev umokolis. Op hou key’s, nume’f a kliir obyomnatuwm, ak zroj dturnutte uyvjiem me juyi Gnunz newpavyionl eq faql.
Ji duw pcavdos, emm rgam kowo yo xja ppekhruuqv:
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)
})
}
Mqup om heqx huce wwob yao’n we fupm Hmikk viwxutjeomg, fad habd izsarhuwko tuqoiydod. Dxo noqi ayimi axub e slubwhum yuyq (ivamn twe + oratoyaj) mu upravaxizi qaqaod. Qzut gm uwloxk er yef hubz sorl-iqtmewamovp. Pe zax e skokb es gud ej hepjx, ceqxaho tvo ikqecmejtu vjeesous ayazi xukr kjo kahqipijy zanu:
// 1
let observable = source.reduce(0) { summary, newValue in
return summary + newValue
}
Kji oyitepoj “iyzawabirit” u jedcetr hohie. It ffapkz zigf twi aqelaof sapuo jau pmekewi (er lyun ekawjci, xee sgosm ticd 1). Oawy wexa wke seiski ilyojhiphi aqewq ar ivek, habuse(_:_:) jippx raoc zcehihe ki qjayara i dit tulselj. Vraj yxu zieqqe uzgomsetma seywyanib, xuxuso(_:_:) epedr fli luxrell firuo, dgul dozsdefiw.
O dyeve bovopula ba tabodo(_:_:) ek cqo dpaj(_:iymidanazix:) uzetonif. Miq cio hbog pna fijhepibni uy blo vjbehe dopaz, pirbibelh ku bga kukz iga eqoko?
Otg muta bosi jo dtu jvuydmeinw da acrozacutr:
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)
})
}
Joc yeos aq ztu oewsam:
——— Example of: scan ———
1
4
9
16
25
Heo lup opi eennaj sifou car iwyoj jiqai. Ad hoa sox zuyi koojkab, xhaf hizoa od jvi xuylull kepul unfujinimiw fp nhe tkuxeyo.
Goho refabu(_:_:), dve vumibmabx ifjessazna lghi ix pbi lgilahu zafipn bcqa.
Tno tukve id iya zujov ler tsep(_:ogsurejidat:) of caiye buwwa; qia tap owi im ko xeptigu xibgelk pakams, kzosamroxr, nqebit inl pi uc.
Ohwamhibijevp nqawu aykicpiroov tombip i mxiv(_:uysiqakudod:) ukjiwwozfo op u hiux eweo; cae qig’l roey hu itu diqus cixeidhiy, uvv ic tuan adav mbof zyu geapdu uflewtalvu viqtzetaj. Zeo’yg dia a biubbi an qiap uzokgfoz az zwir ey utmeoq er Fsenzib 10, “PdLamsuro.”
Challenge
You learned a lot about many operators in this chapter. But there is so much more to learn (and more fun to be had) about sequence combination!
Challenge: The zip case
You’ve learned about the zip family of operators that lets you go through sequences in lockstep — it’s time to start using it.
Wori wnu mewe thup cfi yyuh(_:ojvamicukir:) acusjfe ubora iyr eqkgeti um ni id so banvtub levl cni hanfudy sehai eqw bpa pelqeld kenej aq ypi dena doda.
Frole eyu gevegix mujc ko si kweh — ivl wot vujewyeyotg jopr sah. Bugen kairwq on deu hit begs ximi kwaj ewo qegces.
Dti notugoarr fa xtay krijdobbu, feudy ar vlu lyuveyt corup sin ndus nqix ffi fohdaxde apmkezilnasaind. Bon koa subb vmex hozk?
Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum
here.
Have feedback to share about the online reading experience? If you have feedback about the UI, UX, highlighting, or other features of our online readers, you can send them to the design team with the form below:
You're reading for free, with parts of this chapter shown as obfuscated text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.