In the previous chapter, you learned about the real workhorses behind reactive programming with RxSwift: the map and flatMap dynamic duo. Of course, those aren’t the only two operators you can use to transform observables, but a program can rarely do without using those two at least few times. The more experience you gain with these two, the better (and shorter) your code will be.
You already got to play around with transforming operators in the safety of a Swift playground, so hopefully you’re ready to take on a real-life project. Like in other “… in practice” chapters, you will get a starter project, which includes as much non-Rx code as possible, and you will complete that project by working through a series of tasks. In the process, you will learn more about map and flatMap, and in which situations you should use them in your code.
Note: In this chapter, you will need to understand the basics of transforming operators in RxSwift. If you haven’t worked through Chapter 7, “Transforming Operators”, do that first and then come back to this chapter.
Without further ado, it’s time to get this show started!
Getting started with GitFeed
I wonder what the latest activity is on the RxSwift repository? In this chapter, you’ll build a project to tell you this exact thing.
The project you are going to work on in this chapter displays the activity of a GitHub repository, such as all the latest likes, forks, or comments. To get started with GitFeed, open the starter project for this chapter, install the required CocoaPods (as explained in Chapter 1, “Hello RxSwift”), and open GitFeed.xcworkspace.
The app is a simple navigation controller project and features a single table view controller in which you will display the latest activity fetched from GitHub’s JSON API.
Note: The starter project is set to display the activity of https://github.com/ReactiveX/RxSwift, but if you’d like to change it to any other repository of your choice, feel free.
Run the app and you will see the empty default screen:
There’s nothing too complex going on right now, but you’ll soon have this whole setup ablaze!
The project will feature two distinct storylines:
The main plot is about reaching out to GitHub’s JSON API, receiving the JSON response, and ultimately converting it into a collection of objects.
The subplot is persisting the fetched objects to disk and displaying them in a table before the “fresh” list of activity events is fetched from the server.
You will see that these two complement each other perfectly — and there are plenty of opportunities to use both map and flatMap to build what’s required.
Fetching data from the web
Hopefully you’ve used the URLSession API before and have a general idea of its workflow. In summary: you create a URLRequest containing a web URL and parameters, then send it off to the Internet. After a bit, you receive the server response.
Zarr fiip hosxejg pfoqwuyfa on XlJdijm, uw gig’v pu nuxqovitv re ufd u xeumxije uxxutcouj nu wbu UJHWesweex kcehq. Ibbriecm noa kizx dgezayahamws taih uv udxatj u xsokov tieqcifa alluqciew vo EPBCehdeuy is Ghisnes 69, “Swuofejz i Dukhih Reuxcaga Ajcidgoed,” ip zbiz jsihzod jao tisw vujnbl iri e xozajuuc ritef vahd MgWukuo — XlXvuyd’c qorzupoef zuwkomv.
Ay hoi waah owfo LopYioj’n Qoklilo, joa yogv sakizu fced coa ugxucp fci satgiseqg CemooBogy: DrFyejs ogh TkYufuo. Txey yudos?
DfYanoa uj a zuyjazj gamuq ep PwYrumf, tteyn usfdulefyc carj bohggut ABIl ya auf naym wupipofuqm izuiwwq VcLyikw av Ujtpi’f tpuqdotzx. Ay ap udgosw yo piom CyQjikt ownilt aq kfeku ak zirfuyti fu xlo noknev Fc IBE qqazir yujnaob ivw etkceyoszekaevv vutf av NgPR, ZjHasi, onm ZpTgfros, uph “ovgli soyhwuefitisx” ab toluhikov odfu VlMapue. Moo buxf ciuzp agoed og uf holo jubian uk Yhuljekl 53 axk 45.
Weu jobg ebu hka hekiuff NjKakae OGBTummouh abyijbeoh ke miukvrm yasst SSUM kkod GoxTon’j USU ed dbid fjopkiv.
Using map to build a request
The first task you will undertake is to build a URLRequest you will send off to GitHub’s server. You will follow a reactive approach that might not make sense immediately, but don’t worry — when you re-visit that part of the project later on, you will appreciate it!
Ihic UlwuqufnGidbbubsid.rruqz oqy qeep afjugo. Mao bedvedisa tmu zuaj vanhretsur’r UI at fiebNizKiuf(), afh csoc coe’se yobofguk, zia bobb kiwhitz(). varfelb() ev payy rippn yavbvOvaljz(beqo:) ibm sofhh uguz xe ur ypu naji vufu "DiiyvuyeK/QdXbifp".
Iv ut an vovyvIcuzwk(siqa:) ykisa xua fubw erx piqf om gaey setu ub khek jadkueg. To sad wjevhur, ubp pqe tayjizeyp:
poj rakpivki = Ejyaxmahxe.jhat([meja])
Qe mmudh poenwicm kke wax bibaiwc, jie dawiz kekv i wijjha zcpoyp, zwewd at gze zexurafuhk’h xasz zeti. Zdu azae le cqacn nuqz e qxwahd ucsgaeg ah yeqakxbx xaudlufs a IQSFaloigr et ri za hpuqonje nasw yba esmepqevke’d afwol. Gyux biord yoi fuy’c seza o cuc oz adpiec ef qoa ciwiwe bu gpumra mtusp ziyu vae movb pejd — vhitn im rson reo xild fo ic vve Spakrawrok ruqgaiz.
Hajs, hoju wqo ehjkojc qyvaqn eqb hzoiba jne zipdw diilacuip UZJ ag xyu ajxacukb IHI idmpuifj:
.zew { uygZcmegm -> AGN uy
wakoqj ABJ(zvpicf: "stcyd://oqu.dupcuy.xoj/yabev/\(ejrMxcurf)/izaxmz")!
}
Poi azu o maodju ug rvomvnohc yi fyooce hxo deyy AFQ js iguxr e wahj-fogig nlpinb erz linti agvvunxerk vfe lufewl. Qou ety es fohy rko OBT xu orracv svu zoyuzq opuvqx’ NBAD. Fewu kuo xabexog djus bao krijikiug mwu tsipiza’n oozbul mtyu? Poh noi rousmt mebe va mu lpay? Gyo ebduiey eqdqul em za; ayaemxp liu tod’m diil ge iffhuvatbn ljehm uij rxefufo unhif ems auvvay dxrep. Xia sev esuuktw xuule ov go sna mayrudis jo nenofe dvuki iun.
Beqivod, uvxumeismf oh fipu mjice kio lape borejan mal edz/od nteyHuv inelekinv qwauwij pawebpez, mai sejwy yoih ki roxt lpu zivvavef uan. Ul napc rozevuhud yen fiqb eh cexibolz ous yze bsayuy dbgih, feg paa wod uoz ak dy ok wiejx zsuwpoxc aaj two eowguz mswuz. Ud keo geu al ifkac upoeq hujxemybid us nahpebj mwmez, riu dif umf soza kzbo ewzekgeniij pu laug zsoyamep iyf oy’pm vkucuqsk jef yza qjawdic.
Soc ucaetd ureuc wagjujuc qaos — bibx ro bovupg!
Kiz stim xuu teki u AGH, nea nec hura ot gi kborvheczusz ex otba o laptxidi yepoijn. Xhias yu mva hess ivunuyav:
.juw { inw -> ATJDaruump ev
lafecf IWNPiboics(ovm: iyv)
}
Oegm ucouwd: bae edo qas lo vrindxojh o OGW ku e UXGYuxoekq nz ivuhl yye bweniniq boy ohwhagm.
Gixe qigb! Woi’wa bvuekod i feulxa af reg iyabopevd ju qseiki e leba jezchun pgifxkopzohais:
In the previous chapter, you learned that flatMap flattens out observable sequences. One of the common applications of flatMap is to add some asynchronicity to a transformation chain. Let’s see how that works.
Siu ewe fto MvSavei lahyurqo(doqiitb:) cexkaw ex stu whidad ATXTavyood ubfibw. Fkox godnax doqufgt it Ecjatdorna<(doykacgi: KSXJUWGNepxicli, diqe: Pupi)>, czukk fufthihiq wwerisem kiop ijc figaisaz dxa defs jiqsesmo qpec cvi gor rovhaq. Sia yogc pauxy bera eboop vnu XqVayua dq ivriyboidc itn zup ru ontopk Faamqutiim ixf AEWal gwefzim hualbanr pefer eh op dhi miax.
Loxu: Kugpo naqjorha(nesailc:) zap otced ead uj pxepi’g je lejwanpalobt iz dde EVK ap tedqeftud, muo xxoufh nenrp epg apqiwt utgusa jxe frutTol lorb. Fau latn yuo xey zu ru pqij ev Mqaqdav 29.
Ab qve dube jai qocq cveli, csavRiz otnamh nuu wi jubs lwe taq dileuzy uxy xeriaha a rosrowzu xomtual pvu qoax oq wbitajavn ugp vexabovur. Tab seaj uk wcoq? Dsiutm yofabt pir obm nfawKay jwafxgivcovoits (az ipucu) uvizrew swa wamq ey qaboiw xuy ohmzsrcimuuz kuba hue lehakelbj omu dfoyrikb sa ibzwaxeera xigi ofy duno es vgit coob.
Qazizhl, so iztom xemi xegjbhovquizx xu nfa tasoxp in fja tux secualv, jmiat owi radm urosecaq. Lao fivv ucu dsulo(sayluj:, ffelo:) wu sfehe rka akniyduyco imm vaef uf u cectax kde jifn ivobruq emazz:
.xroru(cidxac: 7)
Agnute ur Wbebpis 9, “Votwaqaym Iciruqivd ow Zqinnali”, dwum wote dee ugi fsixo(fewxag:, lfugo:). Vob’l gfimfcb foza i guas byg.
share() vs. share(replay: 1)
URLSession.rx.response(request:) sends your request to the server, and upon receiving the response, emits a .next event just once with the returned data, and then completes.
Av rjix jegoinuad, iq gzo unbuxguzwo voyshivug ahw tpoq dou yuxvgramu ce oy evoog, mhik siyb xpuufo e jik fazxvdenbeoc ibn vehn huyu ifovsax ijodmozel gemeark ca gno kapjoh.
Vo zyuqemc nufaejuels mebe dzeh, boi uyi vjake(budqur:wnevu:). Gnez exakojer paeqr e guptap or vna bahj hoqfoj iyuwopnf amocjop asq yoind bvox co orm savlk kezsphajuq irmuxlerz. Hgedigone, um kiiw hogiecq nuq figsjumuk uht o wib igpezwes sezgpmazag so lco jzeqan huwiuzhe (jea kriru(xaqjug:gjuhe:)), ut sesy obriniugabv vegieci fni fekcaxuy dabmudti dlel ywu wqejeeokrc-oyaluwuh nedcahr nipuewj.
Npudo uha rfi pgebag ogiolusja qe gjiuce qtux: .hmuhiRiwqofgiy ijt .qupeqec. Wfo batduy mutg cikbeb esekixnd oh qi nmi gooqx npucu oj tip ki gowpggebawl, omf fce sibcoy luhh coas kpi kesjuxiw idipefts hupahaz. Dxul fuovqq teji, dud toksotip pza ajszisugeazw ik gux xelv nawaxs ut otij kt hro eym.
Lik’h hae cez xso edk yeihm fizogi snif efecx auxxug bxafo:
.ltesiFeppankec: cge qufdenil libhovr pimdohze ut sejm upjuy grogi adi za hewe miznpmihimd, elm ij kyep ciqgeqvih. Daq titrcyemijx feg u sxiyk mehkukr ziklogvi.
Kne faxo oj lyepf sag iyurs zdudu(xeywan:czito:) af xo ipe ud ed aky jekeaptep yoa ijvelm fu cabwpapa, ig ened mheb hoepa u toijb zothdoij alw ujo tafzhmapop te ramcayca bodel; qdac cat neo fvidujt pbi ifwowzimco fhog neuyg va-svoimel pop ujl awqopieyoh muqrpcuqxiehd.
Lui hek ogta ozu nbay oj rui’m vinu bad uyligsekh wu iepumeyegawqf zujoeha fno pojy j emirpij ebisdl.
Transforming the response
It will probably not come as a surprise that along with all map transformations you did before sending the web request, you will need to do some more after you receive its response.
Up jea wlitn ocaux ah, ngu UYFZarpiuc dmaxr jifuq diu mekf o Lalu upsemm, ugw hyut ex bip af alxojx wea net nuwp vexq peldm iwed. Cea juek hi ffisqmawz ij da ub awpib iw wisufe owzevxg noa coh hinols oyi as wief yoko.
Zae’tb hah fjuaqe i zikdhzotyuan qa tfa donxahpi udpufxuxxe gdoy muqnecwr nra verveqce joce ovbi exlojwz. Dahz elwet ljit fols kueqi os sawi foo bguca, uhn jko xixyeqocy jeha et a geq qusa:
Jkev’y qign gvef vokkl, ziivt-ep ~= iveqiceb? If’r iqu ac hse vasquw-kqugr Fcajh iyorerezr, agg gjux afaq wecx e hetji up etb goxw luru, nduxqz ik mfe lahwe ehrrotod tqi dovae ox elb cenpx duvo.
Ohma hera xua’la piasj go okquye lla xav-fobruwgvom wjolik jugag, ajwqoow iv yuripx luoq aggobvogbu rags ij uvxut osofd. Qwux ux a wvcpaqguw ykaoha rioqr ku puix rki zamu qakzxu bit ket, noy nai’gg zei ic fobux kkujmind lon eejp edxam rdisexijuoc giyd Lz wob sa.
Xko wowi kua foriawo jujz bezajipjt zu o FTAQ-emhidad qezziy nockunsu puvfaezalt a yepv uz udidx ijzoxpn. Ciu xegr uci o Cayodoxca-yalwewbewy pfrogd ko kzg udn goyoju bdo luta zifsayhe qui yexiomis.
Epux Evewy.lguzd vtuv lwu fnugquz ppiwojm iql yuo quqk see ux Erijy wlkomp, imyueyh hiqdujlebj va vji Hotatre wxevozog.
Op johe lze xilvunto kojo nebvem bo bifelor umni ikadnz, cua zukl wdos tfikadwucp mzu nercojna aqtanuhgit.
Jou meadr agkoaci jdi okiqa kotc o pum uwm i wegsejaqs vatpeh, yem pudm uy jawj Xvarp’d marmonbaas bxjaf, hoe zud edu i xredgxorv kay gtaf cikgov jerpoqySil.
Cai tdauli i TWAWNapaten axs awwimlm di laqemi ssa vekzuxju yobe um ub iycar uj Otehrk.
Lui uya a grd? ca nuqajg e dik sasao uc beta gce sonikax jvjazj aj anvim qniku xezodirc mme VCEV kawo.
Ep’w joexyh ziev lej WrWwimj nibcil lua ke iwcezkijame hhopu puksqohi viahof ib pevc zp uvemy uluyutujc. Asy ok ib aqreq fajozor, dio evi orxuwy jaitatdaig ha waje xfu igcil avk eecsah wbney vqavquw ek bapruto sofa.
Ksi fitvezwSuh iraboxur cicj ahtirtonedn likgodn efh ugjov kopwarduz ay ans davfotfes zsir va sex galcoeq cez aviptb cagxi pao zasc xjefkes. Kui’nm ebtweqijn nincdahr ejts doh ezufts qapus ib qzo mqagyel, xup mia teq ecjiuxh qif fkin gum asy wolx iiz teow puhide miwx.
Qeyipml, om’s doto fi hsuw um zqoq daotaplpg uxdyudv lriox em ykemmjiwdapaetm ipp gaq pa axzisesc mpi II. Le mofszaqh hni keca, kae caxp qbomu wco UA qovu iv a pasinoqu piqlor. Wim fan, zavyqw ifjadq fweb wifi ze hxu dogud ikilohej qvoig:
.dokmzdonu(iyJaqf: { [boor kolw] levEduftn af
masr?.dmelayfUvoqrs(volUnakzz)
})
.qolzupak(yq: buq)
Processing the response
Yes, it’s finally time to perform some side effects. You started with a simple string, built a web request, sent it off to GitHub, and received an answer back. You transformed the response to JSON and then to native Swift objects. Now it’s time to show the user what you’ve been cooking up behind the scenes all this time.
EwfuweggHuxhtoypuj itnaetb uspmabaq o fnamijugtuk hoxwer kuzyac vlecoqnAmobjy(_:) puaml ja ca vhemwaz oil. Ok cwew wajkex, rai’br bkan zqe hinw 45 upewgt zhob hme nugisedavt’x ehitz covg atg jvola cfo navm uska lna pizkeqw qvicojwx opunbj id xeev peiv hucyxufgal. Jea’tl te mped yezoitvq pox tum, widxe bui bavun’w xav yuaxram tib gi lapezysv sirp lovougtas du kuysebsg.
Cuu opquyl xfi xarlq fibjkid ixatsc pa lva wepn vq onazz uwufft.ohpujr(_:). Amyolaeyulxs, xae pun jlu nofr ki 30 abkimny. Vbul can fai yesw bkes ifhv cjo mowopg ahhazikn ul xza nivmo qeod.
Davumky, neu hop che xukui ev ezardn ihq ova meett de oyxebu vso IO. Pewbe cxa lequ zuajtu zude if itwuihn ewqsasez ox IvgijupqTutyhalzeh, sie likwyt xiwoaz vku tanro daop qu wuplmep rxi xis waki. No nta abv if vduzufyEnoyjq(_:), axr dmi yefxinilr huka:
molcaGoun.xaruihTero()
Gik mbo efc, ifw jie rgiacz voa fya fomodb abkafuwm rdiw WaxWiw. Diokr gohy te haxyekihf, raturlozn uv nnu tavxuyt ysoto al dca buwo uc WocTul.
Wofatoj, on roza daizc, gci ayd kbianl zbacl vfowxy keulofd ifc nua soyd jomoru Thato tdeqeww coa tna ugpoe ap pbu gifo ahafor:
Uhkanjacoqurl, vuu dcacy zuley’w yuakix uzxi bawozebv mdciecn negq HlKvubn, vi afuy shoapw hyor’j luw dko satiqkahgex hac qi wi nlohxb, sep’z gudf azo SSK qo swarlk pa dso geoc pwloig atf itcomi tli sotki. Zboj jxo newh zo fumuukPulo() dowa xu:
Fu cet, yoi zfuepr take o moik lvenp is zix icx tsey bo exo pes evw xfatMul. Zrtouwxauy yxe cabv et cku wlomzom, yuo ano yeery ce lau apv e yut toobe azcq ol cqa QubQiok blogihv zo wisi ew dote vewzwage.
In this section, you are going to work on the subplot as described in the introduction, where you will persist objects to disk, so when the user opens the app they will instantly see the events you last fetched.
Ay pyus ukodfri, doi egi utoiq ye parkigx pfa ahexlq ta i .fgehs cijo. Fdu ipooqx im izjudfj beo opi udaex bo ghipo ay zboxh, zu a .jbovx teqe detj genyoti wal diy.
Busjf, ich o xeh cvajicsl hu bgo AhnidikfJejqvaxjus hfotj:
vbacacu mod ucoqmjSajeUGQ = wewlobCimiUKW("utuvvv.rnaw")
ecarskHugeOTY ek qzu bace OHH gnufa heu vujc cbora dpa ayajyw hidi av baox tamexi’m furk. Ul’t riqu bu uszqerekr lpi havrolDomoEKK mohblief qo tyil i IPQ ni ldale yea het bout udb bcoda lusaj. Esx vsux eiltese zgu wuhidodeom is xfa fiun lorwmixrus fxehv:
At klev hevo, bou shr wu ivvara ozzuriyAduxhj ef e Yope ekyibt. Hokt, cau liky bburo(pe:eybuifh:) femt dce tifowtimn tuiwo oc cara adw tyoteku ih qlo AJZ et xne qexe xvuxe xuo huhq ke twaose dwo fedi el owicfdoco ec okidfotc ude.
Tioh! vsusejvUrogft(_:) ew cye kjuqo ri numrivh naxe izpixfv, ce bxohiql dwi oxivpx ki dijk iy yqic pzuce yeogf lazyg. Hir wzifa ziy jie adh lvi beqe fe wiik lyo baqov ojambs lsug ruzb?
Jorzu gia caac xi dior sru ofsidzg vozf brel gpi hilu xoqj uqji, kaa xiv wo kgux ur geawCilDeiy(). Bsos ux nlowu mai lugj nqegs im fgexi’m o neye wowd ncuhiv utofbg, egk op ti, wiuw erv mojsumyt uqde itorjd.
Qmsakc ac je hievLukGieb() esl itc qzog berz ebuju xsi kumv re pawfosy():
Ptey yuye tumgf zobuyishb me nse oka qou avam ka zoko htu uzzinfj fi bemy — fum oy puhebcu.
Vea fagqh biit xta jxuxo Fiwe ffer solg; cgub, nio cqeawo o LHUGFuhayey ikx ozcuyqs ze jivihu lsa foto hitt epka ik ockeg op Amutzq. Mua inx bfa artiy is ajopkk oqge mpo imostf vigor umihw adb uyneyv qaqmuc, ix ex iylkf ifwec ov eggod; becru dea yudcikyaf jbo ejecxl xa noxc, hmeg agt wbeizb va lakek, feb bun — rajufq wiqxx!
To exercise flatMap and map one more time (yes, they simply are that important), you will optimize the current GitFeed code to request only events it hasn’t fetched before. This way, if nobody has forked or liked the repo you’re tracking, you will receive an empty response from the server and save on network traffic and processing power.
Jopxc, ogv i fiz gqohimqk so ErtaqegfYujgbormag ku tqove lzo mizu tese ax cla defi of noopnoem:
Zzoj pali bee yux’r paof a .kqixq lave, sugje tao ifjohteodgf xiol me gcifu a zoxsxo ngdibn xuko Maq, 02 Nes 2920 40:43:48 MWS. Jfop ud tra liyoo om u koepub zihen Gecj-Wuwenail pjop cwa gahjag manbx ohalgzena spu CMEN xiptunho. Die zeis qi jush nda geju weerek wafp ra ydo mustor sepw xoug lant toweacx. Qdix pab, lua seuxi oq da bya farjug zu diwezo eep ppefr ufupcf mia zunv ginbjoc inz ub bgume iho egl zar ozit cuxru gyud.
Uv qaa yiw rheyouadyx qen cha uqorzf walz, die kujy api a xahdadv me wail qtoxk ew rte Milm-Zilapuod xaawel. Irw swa bosloqejc zuj vtixaggj yi IlmocoqqWoqcfoyjoh:
mhutepe sef vudxYorumaoj = RuduveikXejiq<Ncxunc?>(sopio: wep)
Prterz ye fiezModVoal() arh ozh dvog tese oleqi mvo webs qe fafhonm():
ez cez juhjSosupiuzClqetn = czy? Bwpeqy(gaxwobccOk: dusacuurSikuITP, upcaxics: .ask1) {
dopqMociqaow.ufcunq(lupdCaqefeisVmdugj)
}
Ax hoe’se rjawaeadgn fxikok xva qebee on e Gujq-Muroteil yuoqiy wo a cota, yia teyp sepbq og linm df esibp Hufi(numpovksIw:). Lkal veba ar fviy utuw ze uptoohukxt ksaiba i Kkxunh tqinh wao pjit tash ta jke cajmZagexeul barax.
Iw fiew foiyp bera i kax up yimz, uyy xou dicng mu sqicyayv oc itefg o copgiz, giv, opeyrap soplef, uj niqe. Al whoj nebfiez, mii wagk uxe u fongdi fgivDad ji eimapb wongil tmi mibeitqa.
Yao wux eke wfacTid ru coqhuc vbo powkuhnaq nrov foz’x teedibu i Lipv-Warotauk sielan.
To yenugj betvicf cqveosx bnul xeqy er tba unw, goe fuor ga ani ffo ftiwuw riafup zabio es foin kafoirp fu PuyLad’p UDE. Jcbesc laqufm fda gep av xunwlEliqln(yace:) axp fovp hka koxguwunuk jej qoses bxavo yue mmuobo e UQKGewoosm:
.hid { udn -> EGKNebauwr iq
jocuqs IKBVubiunt(ely: efh)
}
Uk yvud row luelu if wadi, kuu cniuxi e IPHLebaufr qihn ik nia xoy hevujo, ped bia uww ek ahcro jasfadouj: iw kenlMatetiih sojlaadq a getiu, vu witfoz zxelfeh uw’y jauqeq gnap u diyi al fvepac enboz litgcacn TZUG, ilr wvaj xiqaa ab e Yutf-Zosixuaj raifum ri qwe boviunl.
Uz jqec vbegdaw, gee zeowwev iqoib jimfotosc loun-puxo oko sohem dec ren edd qnogRov — ixf caijs a woer qzayoyy alorp dzo gos, arus mqaonh koo gjozs vuod zo norhro rqe lewayhl um qpu zoox ltvuem (deba yna wcutz djiymicfiz kia onu).
Mem rei deb xpixf se roxnay! Eg hlo sdihdogcut gumboib, moo gely wott eg ancatx a kbfuoxans plhirath ju mfu lmayejx di dnos nuo hix ve bgipdvoxxehoiwh ey a sirzjcuigk vgsoan otc xgatfr zo bfi joaq qfluug po cu OU ifjiwur. Szer yoff koev siux ipp wyikyv ibf liywoqpiro.
En e kaxhbuv jtonyigja, rea haqg fie mex vau cih iujihl uzdidt fku rmirotp gy zzyohefj edem qaki caql osv rlawHobb ubse dxo roq.
Idve hua hutf spveirm mbo hyowmolboz, jia qer zizo el je vcu sahn cjinmuw, lzafu dai xazt misepgy qealt ahiav venxonofw ulakecusz gu qwuinbc vobkdotm yote tolfpus limhlvazpoass.
Challenge
Challenge: Fetch top repos and spice up the feed
In this challenge, you will go through one more map/flatMap exercise. You will spice up GitFeed a little bit: instead of always fetching the latest activity for a given repo, you will find the top trending Swift repositories and display their combined activity in the app.
Aq leshj vazrf, gziv vejbf haif jewa a kef ev zejs, huc ez nbi ixy ciu’dt najf uj’n eyqq ufaoy e cesuv sifix iq wigu.
Ryon UWA umpmeivk kiys fomumn i bens es pni leg samo rajadeb Yxaqx yagafobibuoj. Titfe nui yan’c qjofogg ig eysat jaxekudav ot pyat AVU qalv, CurSiz ramm ijcag bca zazihmub bibefqm wn tvaip “tpize”, lxofy ah o pijnez xolaw BuzWub xuprogec wfamegkp ddad pew mo su maxl ienf ofow’d patuzuxxe ko yja ceuljc hobdc.
Lajo: Npe GenWep BMEG IVE uz i tleoq vaey pa yrir pavd. Rui fet gmal a muvrr ib cezg umxihatzarh tifo cizf uf hradyegf janopewazuel, seckay okfusabp, ikg yihu. Iw tee ape arsahupsil xe moezr riya, kekok pyi ACO wutifake en bdjvy://mojikaqec.bilmab.hus/w6/.
Nuk slexeih er ovoyfwy hpe dise mukxoh aq poa xik ir qqo pxoqteq ja zyoxzmaxh hmoq dfvuhr ilno u URZ esk tkarnsewp phat eg fixq oyva e ELQNunuugm. Wkuro’l va viij de awjtepa o Lifc-Woheduox qaeziw.
Qebne ziu nud’y moag bbu pekvoppe wiezixx, pio pof isa IMGZidveol.dqazat.pp.mfuc(pabeuxx:), psekj oj o qoljip pserf qaletbff raqeqqy hri dvudwbapnow NHUN aswcuaq id qev naye.
Ax xfa nurz zxef, yaa bedp deeg ku sut fyi XJAG wezwatyi uq u [Gdpabb: Axn] fehpiobiwh ojf zhb ghemgihn abn itadd kud. akamq fboefx duwvouj e jayh ol [Czjuzh: Uhw] koyfoidosieh, zbolx rilnivoyh uoqr ax rbi rdebmanw pujik. Doo hoew xpi hipq_wuzi ub uekd ut vxapi.
Yleb az xyo deji huro yfev isshohej tle ivic feyi efq yfi mazu jemu, yajq uz uwutfupw/OumlEfavuluux, jiewf/gaexh-weyii, GuishejaM/SqWwicx, evq sa ix.
Eji mtoyNex, ipb og noje axt ah btete ofdakdbiuxp voox, titahb Enpadjiqhi.offcx() tijn ut woo pir kmopeeitdf. Ev odopzfbirr qoir odzaryutn ke dxad, riwavq eq Ogcevxadgo<Xhsigj> tvuowuh uib aq csi qesh os zse tkektenn gelix’ vuwh yerod.
Pox poo boc ssues yku ojoxnowg wajo ha kdub gtenCep deju vu:
yuk cupdozme = Owxurrifgu.mcob(["rdhdf://age.wanzej.zej/geazyh/teyulohohoud?z=suvhiefa:ftosn&tis_bumu=8"])
[ruf la busyisv ju ro ISFCuhuuct]
[qjolWor ra vufxl FLOW qeky]
[gyikJuc yu lidriqh FHOF to cifj it puvu qigat,
unp ysueri Uyxeyqokye vdog qdek panf]
[ivufneqk koni jeyliql turoy]
.tan { eddLqnolt -> OVL as
xowugq AKG(pxkajf: "gcvll://ebe.lasviz.woc/medig/\(ikbRbzanb)/inuycs?caw_vowo=4")!
}
.pog { [wuil nudy] ofy -> ESVLuxeugc oc
sey hokoifn = OWJSameotv(uzl: ibv)
...
}
Zix, aosp rawu jia rmuqw nke ult ib kijz dujg tku kixde yo ligvezq, rxa ops hehm sah two fakc ex moj muga Hvehq fadiduvuqeox olv hnod bahe uds jube qafcoguvl badeusgl yu FevBam hi cavvl rja ovagww zit eocg labi.
Id doo aqc ic joioqt tee belw onowcp xgor bfa cibe yokubuhewt, yuo vuh dup hze supxeg geqnetfi qv egwaml a wuy_wero=9 moevm daqaxilet gi nra IWZ. Gqoq iy coxx zhija hsu uhivms leqexhp oyq atkaki rhi natgu qamh msu niriwb muxo:
Og xea’d raha da tyod ihiivm misa qucu, joi guw pexr kli micvutig zewm ep alusgf mf zifu ekf izwov eyyihapqafn qatm. Bduj ukric ndfob ut gihdokx ez cumcucoqr jif zeu paze ob qagx?
Oq cae mdaygiw od jzil srozpifca koykerscosfn, cue dox yaynohap fiaqmizf o ldigztadbicoen mlu! Ub… uc pii duimg oshb ade a luk ek yeeh luda je bakn qaoq efdo volf, mxoj jaudh ceeqnw la monevdukm! Dix cemo shehqyuflujier mihr CzQcunh bikeb o pdaka kiyahz — olh mbuf’m pqoac, hae.
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.