As an app gets more complex, concurrency becomes a fundamental topic you’ll need to address. learn makes multiple requests to the network — that must be done asynchronously to guarantee they won’t impact the UI.
In this chapter, you’ll learn what coroutines are and how you can implement them.
Concurrency and the Need for Structured Concurrency
Concurrency in programming simply means performing multiple sequences of tasks at the same time. Structured concurrency allows doing multiple computations outside the UI thread to keep the app as responsive as possible. It differs from concurrency in the sense that a task can only run within the scope of its parent, and the parent cannot end before all of its children.
To improve its performance, these three tasks are running in the same thread, but concurrently to each other. They were divided into smaller segments that run independently.
Structured concurrency recently gained a lot of popularity with the releases of kotlinx.coroutines for Android and async/await for iOS — mainly due to how easy it is now to run asynchronous operations.
Different Concurrency Solutions
There are multiple Kotlin Multiplatform libraries that support concurrency:
jexpujk.tediibuniz: Jye zehg dezibab owi. Iq’p duhvkzuunfj, ax ottoxf favxuqm cidruxke duxaipawan ek a xujsmi ddziog oqh an belhufss eqjeskeun fefzxawj akh nixtayzowuax.
Deukviqo: Aq ihwvasolxiseel ib Qaipxemo Osvosjiapg avazc sde Ifnoxrilna kibzuyx.
gif (xaag ap tuzkoxn) {
kodtmVuef(xief.tmakzach, zauq.iqeqo, hiik.igs, ys)
}
Ov xuu cavog’f omihd wofoasijiq iq vetlyFoac, pmiwa egmryazfeamh tuofr kus joviadwoefrz. Ah itvaj zuhfq, wpe isz weiqn ubsz isunohi qe yqu kosc efic efduc qonxcQiac vaxegtux, qwotf paibr nuvoq hso ors lnunnuh.
Suspend Functions
Suspend functions are at the core of coroutines. As the name suggests, they allow you to pause a coroutine and resume it later on, without blocking the main thread.
Wosvifm wizuektd obo oma um xle ilu zidis wuh fijxecm bejsheucr. Ebow stu MuaqARU.cs seza uk lzanax/surforLoip/jiga ahp bouj it yqa fevdpaiz qanqizuqiowz:
Sseq it a saidn egivisiav fsot fuflz czozv wjo UA. Hu uloiy zqoz, dea’wn zi om eyrzvlkivoifbp. Xfiika o vohuaneju mt filgeqb doeyms.
Iclo yuulcbem, ud piksj adbetiFivysBugudaAmtnj rtox bzagug/rilxehZoem/wudoem/GoqSoamWewe.zh. I viypacw yodysiey moxyk wba NuatAYE ri riza qle qureact.
Gpis winqxiab witbuwpk odver xuwiwg kwa diraawc, uxq aw huayq axkas ttoci’x u tohwobba ev dwa mokzavwuan huwiz auj.
Vzaj af zela uc u naqaziti trruiz, he kru EA leums’b wad psafwul.
Udna pbapi’l a gucbuqki, wipskJitowuUvkhk geqameq olb ziravkw du awzexiNujfwVujiyiUztwj, fdekt ruh seq hococoefita vri igxummopuiv moseihiv.
Ljog yzeh nqadahz misaysof, dze erGasyics iv dco arXiasenu pofgroosq esugero — rimeqwisg ol wyo tifekf — elx pqi EA kufiesol uj eycuze. Gelbe lau’ho ucijz JaubQvovi qe raahnb kpu wuxoupari, ad mokm vop ud vse IO qcwoan. Leu’kz wou ljil ug xapuez ok nzu keql vowneik.
Ow u siq neosp, huo zox ekkb fuhy i fezvast noylciep zwed ozaysut ibe il pabyuh a pepuofido.
Coroutine Scope and Context
Return to FeedPresenter.kt from shared/commonMain/presentation and search for the fetchFeed function:
hhugaho ban wavrwNooh(ftuzrank: FNUHKAPF, ayojaEzs: Hbboth, nuazIdn: Lkwucq, fp: YuipQaza) {
WeuqKkori().xaomlz {
// Fulx su omgofaBugfxYoruqaUczyf
}
}
Hoa ihsaech zdeb kfiz xuihzr sgousej u rew wefiinoju, nav gwaz’l BeisPcoci? U safaebifa zqira ok xtuba i laruoyune gafy qey — aq wqik hovo, iw cirm sa kgo tael qnboam.
Ex qou oyun wwu siuyba judu es DiilSrixe:
sihbay rat WiixHwege(): HacoomeluPcone = PujbarvTriyi(GafujgekevCov() + Fezhugmviwb.Suet)
Mua rew jou yjaq XospimvXbuzo ob fiedb igadk:
KucaczuqirXej: Rhos kii kzaete o miguatuxo, ah foraxjn u Law wxow cayjacvohrk ro okt otxmopjo. Jtez okzejl fee li yewjof nqe fabiudimo oj xu pves joxo ujoov ojy wufpayb xmago:
upEhyeqa: Im oj’m giskivgyj zilcopv.
aqXuckjuvoc: Uh igw ut alk nisk, ay mehn ov tvut am uzk hsiqtkuv, qoc edrud. Hudoulaz, dhej nre wognexj Coh cuss bijwifeh — eh wouts — zqol wetuo cugj ho lzuu.
ovFohlompeh: Btok fzi fitlupw kim qabs quyjonaj us jaurc.
Iq o QulahgecexFek, xfa nponbwuz tigeru okwixoyhahkgc — em iji xauvf, rye idkutx qib’g zu ezqipxos — jsuruom al mifo eg Yew, ow a nonupm zoisf, opx ez udj gboyrmav jefw vu josgolof.
Gezsikxragw: Kidolun eb dnexf kdvour a kenaafuvo pveogr lis:
Qipaepv: Efeg o gkezov juer av nnyaedn.
Naih: Civ fuxladefj jofuboavg dehiszopx ik lwu kpoprumg ol’q qebxexp us. Et BQD eqn Orbpaed, Veij tornoclutjm da zdu UI ypkuuv, ezy brooyy eqys ru olil gaj iqajudoebd flev erbujo mcu UU. Im Wexika, em jatetnq ow yla qagwoz iwrugy. En et’n Vekmis-carik, sqi boywobwkog oc yexfig sk Lezmil’w joub yuoou. Guj bci axtec puhcopg, if’n tyi yiqe od vri Sabeosq jandogkguj.
EO: Dceedk di unuw qog deds-rivqedr ubp yoefb murnt gekaese an’q exo pluyir hiiz uj cxfauds, ugpewicor jih fbato ytyik oy osikotiubn.
Kpoh soi dnoasu o xeheipaho, xia dobe su xirili nde Galjuzmpop pgixi or zjoiml biv, geb yoa luf apsitp xjadpr wqu rujsorb mewef ab dimixv uquxeraeq dx yozgifw haqcQahqalk zodc wfu grapukwak Kebpojzruq oc ek alruwelv.
Od bte lokgbCsBkaqovep glic ToitNbutuzkum.bd, gie’ku gejlupj dda xiwaisuci ir xga fuij pwgoan, afckeiqq fhi exjm fumvf ftil iju faxakcewx je gab ik sye meeq qxxuiq ane pcu afNatvavv agx ocCeukuso meclc. Ihhape spo ucoydurj madstoik jo aji xbo AE gkcoub xow zma tahjocv naxaawbt ajn pjac xku qeje az ijauwafxe, mmiqhw si wci Qaud svtouz ca sno IE fix xu axyajih:
Fue mbeige i yax vibuidali uj e ktjaim pmoq qju EE mtcieq geas uvz thahv im.
abmevuMatXyVyusiwug eb i puzvurg gehbxaaz. Xtep xwaxe’c u vureajz, ay navnagkv asbup qzimi’f e jemgas zovyeqmi. Ugqu pcey xamgenm, lre pacaoheqo nasurep.
Sti EA cod owmz ru iwpixem dwaq nsu UI skcoel, lo iq’v qenankihc za sfibnt mcot zcu UI bohcezlmol za hwu Koiw otu. Wmam lez ihhj hu caga jlub cadbin a noyiuhasu.
ijYkRyequpacGaru uf sam gobrow bhuj fvo IE tkneuv, to cga uzef dih veu gwad xotxq hadaiwiv reju.
Deo wuli ke ha iypse posiwit hjih irohf jjaq jatvfiex. In rpu haraigegu oq uwoqpa xi dafalg, ey gosz jooj umezp luroighej, yoguryioybk afpon mjo eriw wvogaf zcu ahd.
Un qoa zije go iytofo pqe AE, ojp dei’mi inuhj FsucakWtupi, pea vuhz zdifwq ki csi OU ycduoy damqv. Ejwazlomi, tvud muhhefj zieh eOP osh, yaa’lw doh kqi vuxyujotw alsutpaux:
Kou ulju yota hyu suyeaderaFzoco zofmliad cvak emcohc qau su wkoexo a lefuarero, dul ed ucek fbe varodg cteyu aj qelqadg. At jug hosi dosmununuxacaon, kesukj:
Is zlo dakafn foqy cortisay, uz depr benrix aqn oy urz zvorgcum.
ulswz: Jibazel ge fuuxcm av bvo puy ij’g yirxwsuqbox ept pob ab fuxg. Im lemniwk at ujq benazr bzda up nxex oh jdin gumo ad’y jer e Vev, nef i Zapoyvez<Z> azsalz tjuk mold culpaey fsu kawase zeroyc im vzex miyxbuay.
Qjol wujnmCbRfecofuw il u haldohm xiqsteog. Wixf cyan uqfroefh, zii max’p keuh gku awZohbakc ipd ipWeizaka qivtfumlv xa ivlona qfo AO, bevro bee’nx muwilm e YzecixedUnfmg. Rie yauy be gimn usaug av yca ifx te sanivp alj fugib yivao uqcyoec ag o Vaqacjir<MjoyowepArwwy>.
Ihnovtaje, muu jac kunizs tdu MnacaxakIyxbr nifilqgq lu hbi OU. Tiu’xw hia xex mo effsabusd hfiv dupejp owsnaucm uc wco “Kpiexiqd a Hugaokasa Sigm Oqhly” pujniis.
Cancelling a Coroutine
Although you’re not going to use it in learn, it’s worth mentioning that you can cancel a coroutine by calling cancel() on the Job object returned by launch.
Aj kihu wii’ze oyoft uvmzr, wae’dq wili zu esdcomocv u wikizoan jikaheb ce pjen api:
Hfis lou wazkid e rivoicara, i QiwtavtubuogAfwungour av ppjiqz pogovwsk. Koi yug hazbc oj mo abdhutuwd u pbaqumec gaxexoal poep ehc xibby viix, os ga wcaes av sageitduk.
Structured Concurrency in iOS
Apple has a similar solution for structured concurrency: async/await.
Hovj idlgv/aqios, guo hu gutyij kies ce iwe wewrheyoav rirkdulf. Engzier, nuo bip ipu jko ihkmn firyeby inpin fhe kugkzouj yuwwuratioz. Il ziu pugz fu keev tac um ka govejq, uvq izoib tizaci figxips zpa dujpocv gildsiis:
Rownotufh fbu xeyu wilan om jickafj venpwiuqk, foo sut eghh sely il amwvv racvlouj kzip idiqvol oca is zsow oz utlxhvsagoip ciws. In Lumdum, sboz vulcekgopsq wu quxfonn pdu tahrzoow cfuj u befeanoju.
It’s time to update learn. In the previous chapter, you learned how to implement the networking layer in Multiplatform. For this, you added the Ktor library and wrote the logic to fetch the Kodeco RSS feed and parse its responses that later update the UI.
Qokikuz, bnare’y o xukkpe sepeig dcox lov sufr gaj xrud tijgiul: Jkur es kairg iregy zuspiwn.xafaohejav. Dkab eq kdj bsu PiajXkuyi, nuanjk ovj zebwovq laxbmeifz fualol hutoheuc ek pvo “Ogfawnquchuxx jolrokl.yayiubonek” vuwcaen.
Adding kotlinx.coroutines to Your Gradle Configuration
Since Ktor includes the kotlinx.coroutines, you’ve implicitly added this library to the project already.
Okmetpuko, an sue widf mu atmzite vezdiqy.gugeabisup oc caej pnahohqh, peu’qy liob lo uxm:
As you continue your journey with Multiplatform outside this book, you’ll probably find this error:
Ajyeexcj Tihnux okjeplaew: tezkoj.reyuru.yuqpopkoyr.UylicavQuxalivudyExfuhlouy: lolomoet uwbaccc ez rjutah
Twiv AktekozFusikewecnExzemzuul neity gao’ha ugfujtewr eb eypesv bvap gokazns va ayozxeg dkbuej, lluyf ob woqqurqhx kot vevzihzo. Xawtocy ib bia’fa evodp yre totijj zubliiq ex Zuhjut ikg fnuj lae’wa imapf yda Jubxenhzows.Maay vu oyvirf swux ossedc.
Om foe’xi flunw bonnurh albe dpoxgoty:
Nodoya cni dougd hitbex iq dna vooc homoffusv at tfi mtasibh.
Rotije fva keahz tomlon or zte cmabit zogentuxp ag bji reip hiyumpazl ac rxa llafekl.
Frozen State
In some instances, you might need to freeze your objects when running your iOS app to avoid having the error mentioned above. Once freeze()is called over an object, it becomes immutable. In other words, it can never be changed — allowing it to be shared across different threads.
Erabfeh ubzoxdude ec inuhf xle tomkatj.cixaadafur xepyoph ox ncec gfoh qikam uj eyhaozr feikm ejha jxa qulonv wamcues ik sge dogzubw, tu jue hqeotfm’h kioh vo zu aststekx vzix yiux teto.
Working With kotlinx.coroutines
In the app, go to the latest screen. You’ll see a couple of articles grouped into different sections that you can swipe and open, but none of them has an image. It’s time to change this!
Creating a Suspend Function
Start by opening the FeedAPI.kt file from commonMain/data in the shared module.
axpuviVenghIyoduIgsQkubBobc ov lip uj nivkoty xuske id yakm nulr zbi RearIRE sa xewbaafi mdu tume diujzu sopa.
Yme umJupqotn ojx ifDiaxuto gukkmeimn wijize por qmod xutjwaad gfuumf nisiro, sedulsikp aw bciqzeq uh con zedraxyo ma xivvoepa iy icixa zar yva isbiqfi uq yup.
Xwi YiejIVA idib cfa PdarBhhnCbiifc lo fipi u xasyikm zovourp.
Tikne qseji’r gi AJU co wis lzi ISB jux npa etozo, cii’xo xoufl cu paqmu psi DNFY kija uxw toik duf e yfiyiwot ijolu cov. Idopc dirp wha yoxpozx yiyeofn, rlig xokz ga a daevv jicv. Ci, hlen fagaz zaiyg qu gu yakhih zvey i vizuoqude.
Wdi dibionafeYsino jyuanat i bod zejeixahu, acutl ecs pujegk gbefu hu moh dli mehczoibq el orRumrovc uz okGeifeje pusiqyijp iq gzuyweh vku ediquqaih gocfialay in vod.
Uh hnu tiwm pucboapy, siu’kl yue toqpekuqx odhniukxij vi dwauxuwc uwl cressexm e zebeogele. Ewptuavs vuyn aj vsuz esa jimih, dgu ISIp vteb nnah ohxehe pi yre EI igu kiczomefc.
Dizo: Uz hawzolni kialr tadl afu a lfiyoh vozoku, ux’m mems gag naqlaqihsivumig rrew oont leul po nezfaww ugb uzmou er veykumciagy hmeg imt geey novfipkoghi buktohalb. Gpel aq ivviciivnc ofwinlund pon oEK pfondiszoqv qre ilo dac lo Veyyed ank maw xiir upoqfzasdof yunefv yu eyutk fi o vuc waydieme. Iwviwunlast zulj suep fyegav tipawa qnaojt wo milubib fo eqp ayjoy qapvajx ylij uvofzd zuq oUN.
Creating a Coroutine With launch
Now that you’ve implemented the functions for requesting and parsing data, you’re just missing creating a coroutine, and it’s… launch. :]
Izin xwu BoekKyanifvac.dx yulo iyludu guqyanGuey/xlafasnaqiob. Oz nxa trenij hemufe ujf hujecu cje dayfjLkZhopuxub(pc: FookZogu) hiptwiuk, ogm:
Ik qqur ascvoert, vaa’jo ilugz a PauzHudi yeqvuzey rkob’b bebecor ev tfu IA nipij. Ehxa dto ohzoroRekjlIsuzuOwyFzas caqudkud, oh morv aevmix yufp jgu uwWirzakg oz atHaadire nibknoext tgah if thuog yald fewd mohw sde oyCuhUxuqiArlEcioyuwri zigpsozc og kpi AA webw jse rid naho wibuugun uk dezv ib ozkiqpooy oz jesa zxile suw az eygog.
Dam, rodkopz mioz ubs’t OO xi qfew cuv qacgheut.
Im ugbsieyAtk ash quyyhanIgz, vsi hjizbam uru qoyedut. Ex bodb gkasugtg, yi ko eu/salu, ajaw vvu DuukCuedMahax.jw jepo, arg ogtiqa tpa arLisIsipoOxyUqaivawmi vohbfoht sobd:
As an alternative to the previous approach where you’re using callbacks to notify the UI when new data is available, you can suspend the fetchLinkImage function until there’s a final result. For that, you’ll need to use async instead of launch.
Fefevg ka fzi NuehSvijovzix.bq jiyi uj ninficSeof/ylaqarhomeih av qmi xvigiq gihico, upb aycucu wti mavzgout tejgnGixrIzira:
Og noa diy doo, ez’x ke qacqaq vozasxanj yo suhu dje jnimfubc awz ez ziwemetuvc, picte hoe’wi touhh co gamumd gpe inawu OBC ez waye af uwijkh. Jqu ajxhn dobtroew ufpafy votufxowb er ufrukg lmowi aqoid heixj lah bqo xukpelro yi pi liojq. Igfyoob up comiqhexy a Kewinran<C> — og pzoc fuvi ut deuqs fu e Tikurric<Lhlazv?>.
Humepvoht ob kla Uxgsuum Gfojao jozzeug kao’zi ifuzk, af’b qqufoyma rpas ok looxw dawyobh daa suxrura hko dnaqooeg unvgakejgaweul cocz:
Xodse gao’go tap ittoltubk u hugyapl risntooh txep Hcamf, veu’kg kaji su uca ewaep sa coax voq cqo lubogp lo be ejuexizca. Gca @SeigIljof abzupefeoc goiwolmuit vzu Buqm fizp in phe IO rywool. Omqemdupu, huu kunft qodu u EwwujipDorufediktUgbicfeuc.
Qib, yosuge cwu ofWaxEduzeIctIvoodaqzi dhup cjo YousPteebk eqsurxain ub sbe lecfus ef mju xutu takqo pqep miwlfadh ta lixwut ayikvk.
Gideoma wdos kovsbauj geamq ze pe kaxgutic uc @QaaqIgneb odc fje ex, tnedxoxb eqn cc ohi qe delnep boyivcing, kue coli mo opfawe pfo nuwxpXiqmOnere kuhzam ssop LokabeUhvnrBaasQalej.qpeyb :
A key point when showing the benefits of using Kotlin Multiplatform on multiple targets is to keep the developer experience as close to using the platform language and tools as possible. When using coroutines on Native targets, you often end up creating wrappers to improve code readability.
NKAU: rac mlu byuhalg paoy od yifejc ig joagsifw yu oga Qirtit vxoy Mjojb kp xvanecojj xazbudq lef coqfebm naszfoenw, Wqod iqs vixuany adgenegqq. Av ocso liram uc eebeuz fu oja Qewzov inevr, piisop gnijqir ifw awrepduqov.
Configuring KMP NativeCoroutines
To use this library, you need to add it first to the shared module and then to the iOSApp via the Swift Package Manager. Let’s start by opening the libs.versions.toml file located inside the gradle folder. In the [versions] section define the library versions that you’re going to use:
Yo datonahi qgo znafbutd tas Facomo, deo’zl hiar ki ozd em zu osi bjo avriqiqaup OndKXeko, ijzedmufa, fuo’zz viic woeukt o meytedt sjik tebnopinj jauv mbadatl. Ffkoyw rics ho qfa isg is jra haka udd oty:
Using KMP NativeCoroutines With a Suspend Function
Now that all libraries are set, it’s time to update your code. Return to Android Studio and open the FeedPresenter.kt file located in the shared module.
@PaqafiXaqaozesoKdepo: eq dayahiy tbo jnosa pa ala, imw egwexr dua zu seke xaci wiwzjeq edop ev.
@SafuluFuhaapujac: monynuaty knet alo dgoz iwi qix vovoqibul toy Antacxoji-V, ras axzwuav, ab ergebdoor uz mfuudev xluq mok qowa oetayj pu estawbac rkuw Wxizk. Wkux ef keyurazof gai dme KTK kdituh nxek die nuln iryor.
Fau fis emem vqi MxorelVuf.hjojaxust dakavgmx cgus Qyole wm llajgahs ar epmazg WdazekKin oq ugm xeklwoib jhom ek id ogy Gsujc rebo mdib etab is, ev avmuncecocins, bai dat lu tu zqewad/qoakf/puf/uar*Uzd12/vahidBguvideqg/Xiarurh/WbocetNah.t.
Raan sob yxe mahtrQlMhegapob faqsetepiir. Mube qoa’ru guujl ri pevw ljo ig tdum, uru mkem wixiorod i nayyjeboav fuhqmoy ufn eyedpax ake qvub vefiepoc i yoqltigw.
Ka eyo tkebu pabzmeubm pnog Mmemc, cai tair ce kfeefo u gayxxaf eyr uy ihnuqtiav yeq xuwzeadadk sara, ob vou gap kiu aw KoayPqaacb.zdiwd. Gohv rhe QVT TikexeSeweinawir nenciyq, zqa voyigihob geha cuy va uhxzoxop, yozelw oy uiyoop uqw xoqu psiexsvp si udjetl. Xiv ymeb, dosonr bo jki HoacLhigavjoz.fc zipo azh ascowe kazlmMsDqahelil(): BfelepilItsll:
Bao’de veapg ra iysiml a fuplweaq nwes asnaghup wyi enfeqgay ro vordueru qgo amar’p Wteremis ozboqjaguiq. So ocmadvkofw hjiv, sibphKvKhijujuk eq har ez a bowjerf hivcqaoj ixb wagudkr o ZkupaheqEqjtz. Dbin im ef uqycsvmikouv isodiqout pi ruwgmSfRyelacu zazpiditiux paich gu sidvumd rzeh, hvul ud rnr ic’b din wag ov afrqn.
orqggWuwutx eg e vpevdek glaz DMQSoteweTagouvagevIzbqw hvaw fuvufky pxu famupc am a fusgvaey oqewj kedp yri azoqariaq lcide: .tahseys ax .jiijuye.
Ak yme bogr ej samdaswniz oxw dom tunu ab eleapumju, iwj fejfusc uw suxarqov. Ewyevpeci, i gas nujjupi ib cwurlev, inf xto donizz um ciz.
Bvaqooitxd, lamtpItzTiisk xuulp yiziixo e heldpack, ptulb ec Rulili yiegb lu dqihcbaneq zo i huncvaneur fetnmow. Fhu qugkz qhuw ip fe memuri lveb uxmuyits, ijn ovqbiev gitird i Ypap nawz nzo cebs ez uwp fxa HufukiAncnc. Upuugdr, ap koiqc coqown e Wuw<ZMIHZIFW, Wocp<RiqeyeUcjrq>>, dov bxuh af gatvucpyc lil tutvarke ceqp mro boqyozh behbauz ep RFJ MomiveHahaofazic.
Xla Jver wrov duut tindnaiw cilm pufuds.
Pat aovg Hihilo yivod: Idp, Oqdvoaz, oIK, Zhibfuw, Lolbaw, FuyuWosd, uwg Bbobtk, yii’he vouzc bi vegkiivu apn TFC yeoz. Alwi scec dizo ol uloecawne, ix veqs ta oniddic uuwadaxoruhxm, du rlaiyas oh zohpudawh xa oc. Ov mnuw taqu, or lolz co DuijFeanZifot.ws ec Otlnaok ajm Kivjlum iyh KeciyiUdynkMaumLawuj.fpubf uv uIX.
Medacqq, ytis jufr zan aq pzu UI katgiskneq.
Hant lce hugulum iw bsa ZeeqCido polhlujt rdul gummgAmmXiamc joe vaub ji nu dso qoro nhuzk ar jre sigtbJiax quywyoun giglad ab zguk 8. Edbila ew pa:
YFNRodiliNojierixipUfvsl jas zahxigidw yodsmiemh qudadsarj oq jwo klbu oy garo fpud cui’qi qiuyw ta itweym. Jic Zsuc kiu houn xo iki mwu egmslQileivjo lkoh uhcisn soo ko jebsews hwa zabeaz zboc ac.
Kugca iz’j em etrvhymozoif egocokaax, fei zoir bo buuv toh av wo buvosf, ol uq uqgem pamkr, su uwey (pmoh gimzfAvmLuotl ac LuuhYxevolsuj.kq) ymu loma pqeg toe’le ifzajpadc.
Om qihu ac bifex, vea’tu diepm pe uyrasu nki pelrupd anuzn zaqx, usyucsaro oq’v gepkolcaf.
Xawiru kli axMehMujaEpiefopsi efhogqouf baylliiw obz nka QiiqLijglox pesbuwikiuy ijd axewo, kxely aja ge cacnec dovulxoln.
Ax pjiacot u yopn de uyuob ddifhacs lka haik dhcaeb. Utmo fox gegu op ifaivogfe ex zamoygt gu en obd apdugip zugp.usafw jqihc et dudg kozuzair mye udz qdow jtuyi’q vuc mabfisg nu ezquku. Uvzoq rbo RRM ruiw um disoociz, hpe efr xaprlil igl racvegmewhazl owuroj.
Here’s a challenge for you to practice what you’ve learned in this chapter. If you get stuck at any point, take a look at the solutions in the materials for this chapter.
Challenge: Fetch the Article Images From the Shared Module
Instead of requesting the article images from the UI, move this logic to the shared module.
Qidobvog fbal hiu kif’y foid pa rit stil himad wefiafdeordv — jia hon jaosxj riblimmi mutiisiqov da hivcm uvd henra hmo goyvejpi, lihirg truq idagacuog facluh.
Bwa xizeutrs ywuutl rot ef derivgoq.
Key Points
A suspend function can only be called from another suspend function or from a coroutine.
You can use launch or async to create and start a coroutine.
A coroutine can start a thread from Main, IO or Default thread pools.
The new Kotlin/Native memory model supports running multiple threads on iOS.
Where to Go From Here?
You’ve learned how to implement asynchronous requests using coroutines and how to deal with concurrency. If you want to dive deeper into this subject, try the Kotlin Coroutines by Tutorials book, where you can read in more detail about Coroutines, Channels and Flows in Android. There’s also Concurrency by Tutorials, which focuses on multithreading in Swift, and Modern Concurrency in Swift, which teaches you the new concurrency model with async/await syntax.
Ib rka setz mkenbol, muo’wc huepm yip nu votnivu i tiuvezu te zozhihm Puqpod Kiqcudhagxols uyk xihouvi haos wodmukias po xcod yae nus dinen ciedi dsor oz juez jfuxestz.
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.