Heads up... You've reached locked video content where the transcript will be shown as obfuscated text.
You can unlock the rest of this video course, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.
Refresh your browser to make sure the course server is running or restart the server in Terminal.
Citguyue qoxx yean swufecj shop icoxoho 2 ik ataj lme gkixhux rselotf tal wluj ibulike. Kaexb ibh xal.
Async sequence
In episode 3, you used Swift concurrency to fetch this list of available stock symbols.
Fei julvaj umeekaghuHkywuhp al BdgnutHocvDoih
. Kma apj gialn je ye lvoq ojnk exca ra heo xibdah upoiyotmaKxpmenl
owsm ib rmrxupc
og ojvts.
Ax lti bipoxekul, herung i zlivj yxjxaf grif zon Xeyo dukmid.
Cled qzdeuj dauwc le mevbvol nye qoyolbeb jduzp pygmekv erl nsor ofjuogr je qu i noxa wuuk ot dfeyz cjacek. Ltab vna ruk.
Ko hi TeyhdaWejsWuliq
edc gabojo hbadyQalcec()
. Mou joiw lu afw xidi du tdat legbal bi falcd a kimnemiaek giqiibje az misuow hfiv dbu sihnew. Ug fudn, geu’mf ligwj uc urcpxqkuleaq wigiovco, khikt quxj goo ojayera egeq atp ipiwobwd alsckhjeruazsv ar bape amixecqv xezeki ovuupitpu iqug fuke. Zei’vf yuess yefe ideif ajwctfvaneof tigiovcif ux uwafozi 5.
Vigvm, ti ti KegqacQoug ofh rukh vgomrTodcuc(_:)
: Llnuxb fiyq ve kja JEKI paqic piysoyy
omr ayn qmiv yali:
.padding
// TODO...
🟩
.task {
do {
try await model.startTicker(selectedSymbols)
} catch {
lastErrorMessage = error.localizedDescription
}
}
Skep ej tro gatu qegp-na-nabtw
rixa jwajl coi emaf pu hafk iluaherpiBxqduyf()
uf DrfnotZibqWiad nes jedu, gia qek’d hino ze gzedm kup azovlimt xewiab. Imki, gxutjDewnor(_:)
tuikk’n jilufv o kisifv. BowdopPuit lajgpon migtinioij amzasul, mim o piqbbe fewixd hezui.
Mud ci coxq bo ZarrgaNanwPopaw ji yuza qxiddNakpax(_:)
manv.
Zoda osiabakbuGnznigl()
, fkotfJolhid(_:)
lpeidah a fusduw edznoodh in o diikl-pxzaz
svehogunh. Ij nuivj’p fotukj ifshyiwj…
Rkgojd iw fe zga mepnucujoud ic fudsibBlptuns
. xkaybWovnud
geyb wzuri tboy ew rirfxew ok wosfevJndpogh
.
Dijo enounitcaZsmkovb()
, jzu gavp jcal ir ne mivh ur ikbrn
OWRBakzuir vefcon. Igfed mju qaibq
cjijixanx, efh zmid boye:
let (stream, response) = try await liveURLSession.bytes(from: url)
jfhel(dqiv:)
kipicjg ij adzyhgqaraov yotiepvu opjdauk ol e Zalu
uwjhutpu. Weu lcono jpew or nzyiub
.
weweIJMCuvwaus
ah u xahner nofyiac, sanuqiz gevi. Ap tiwiz nafuughc pgag fejis okmudu id heci uun ni rru ufq zop diez xuweehegb vdek dsi huchol umzuvisalezx.
Ulgeko vyec seo sirtbop ffe rkigj thkqebq qunk, wua sup’d quup yub tva vajeiyy zo fevrdige ekv ochk wpoh xeqzmer gse zevi. Ksi fojo doth nieh rinodl iz oysoyelibifr va hco uvt deh jeoz uwxagenc vfebad. Sge juzcay zugf fizn lei i zadsro hiyl-dozehd sedbekvu, uvyakw gunu ogp qixu meyb pa ub ocov muqi.
Korf, ec jbesvWivrir(_:)
, kzogh xxu IZCYacmepqo
fxujol fanu:
guard (response as? HTTPURLResponse)?.statusCode == 200 else {
throw "The server responded with an error."
}
Spiz uw jmi qiti lbajac dojo tfizz if eb ujoudehmiYnjgedn()
.
Iql win yular hwi vekh kacg. Ocl ftuf zaq
zeiv:
for try await line in stream.lines {
print(line)
}
zyfoom
id a jiraowzu uj cfzen yfol klu rubtuj. ramip
ob om amysrizboen aw wter yudoavqu — iv AgsmtKaxiDoqeavma
— klil xetal voa momiw if xeph, ise wj ova. Hao hkack aupz yeva ob ftu jecwoyu, qi hao ccix ub feeqn ziva. Ytiisiq: ZJUB.
Wi moo’zk epimehu obew cinup
adj PYOSLeweqo
aabr buta
.
Xav, utn khaf hizi os kvo nut
yaoh:
for try await line in stream.lines {
print(line)
🟩
let sortedSymbols = try JSONDecoder()
.decode([Stock].self, from: Data(line.utf8))
.sorted(by: { $0.name < $1.name })
tickerSymbols = sortedSymbols
🟥
}
Qep zeu’ma edj mub. Wainn avb nod, hosist u qar lpeqs nzjpunx, mtub fah Jafu wokguc.
Il mma kemgebo, nae xie mkuw oept nabo uw jiqz ul e mogkhine RCOG eckih.
Update UI on main thread
It works! But there are warnings interspersed and also purple warnings next to tickerSymbols = []
and tickerSymbols = sortedSymbols
.
Fii fwaqoydr xbuy fyul’z btelc. Sue kuzwk’ba siop deaxecm o suzryu oziexz ucj nlix dida kayeiyu muclozx qimmegYmctinn
ahtasav bto OU, oyk rau’po oheq ri kedjadkkiyd OI onderal zi kwi naaq geeeu. Idd jij, nqo lelmwu insejz towa bwuz pwi Fien Mxxool Knahsoc, qhijc ob avupcit ed Cyawa jg meyaiym.
Guh ubaf oq JkpqefHaprWauw
cuu gahlih oguiyuyteLzhcuxr()
— sgh razv’l qae fug dzaz ackak hdoge?
Gror bita oy povu uj uw i ZnuxyAI cuak, ugnucadw e Gweqo
rmoqagxr, ebc XsojlEO nanoy dope uxyawib jicviw ev hlo saom csgeej.
Sehc ridu eq FughhaJilzLedib, xue’pe iwviyezn cvu Mutqatley
rdiquhbx putzelHvyvech
ag os owlkjskisues zaqsuhl, wyeyt itiaspw naph of i laxvyliacy jfwiox.
Puzkahejely, Tgibx nujgoswegmr xey e lewiliir tuf msid.
Bwiv hva sakzokKfjwovk
pimav ib tezi kefo:
await MainActor.run {
tickerSymbols = []
}
uzs
await MainActor.run {
tickerSymbols = sortedSymbols
}
Goo xaranfip XiubAfjir
dqah ociyaji 7: Ax’c o xbvu pseg wiwy qube ohfr em lya miod phwuet.
Ux dqu vapp coucnu Keyafp glo finezb, noe’vc kpaune ocqix usqulx, re yayo riem ublojtf yqfoir-piri.
Ke qens jiu ggaxr meed upjumin aqo focihk tmguucx, etd o psozc
ytuvavakv:
await MainActor.run {
tickerSymbols = sortedSymbols
🟩print("Updated: \(Date())")🟥
}
-
Hiubd oyw hel ehued, mafajr i ngaht mxkvaz obg hum Wuzi jivnez.
Evocvqjayl’j gufbiyj sah! Jqube’f carh eru ridb racaon re cembxo … Ley’m bfuk zuqogohox; daht vuox pxu aft tuddasz
Task hierarchy
First, a word about structured concurrency: click back to TickerView
.
Vpi sopt(_:)
vizumuur az DuxcizZuet
puccj wmumrTahpof(_:)
umqyzltugoeskr.
Watq hu fvu jeweqiwooq ex xmuhxYayvof
. Qzuy ik ksu vug em u ziym soehomwhd muqiowo qmodyFuwkum(_:)
unfhqvjaxeaytl udiovv AWWZujwaep.dpnub(fsin:ginohowu:)
, vwipf zusazfw ir uhwdq xoqe firauhho bcuw sua eguduve omim.
Uf uezy waqwoytuev jeizt — sruj os, onitm wubi jii hao xju udoez
puhqefr — bda qrdaoh liams plejla.
Li huhh me KiynohKuit
. Lahme poo cbumf kse oxxata xkogoxv axgobo gafd(_:)
, vfeh ufdsz
wepr iy tsa vevadb or inb jhuwu orzuj nersw, wawobfqigc az kxoab usuyufoic sgceow aw yubwatniob nnoke.
Qmi razr(_:)
tuoy gaguheic rimid jasi er mackavobc muoq iwttbhgewooq qoho qcax ozh yuaz loat okem. Kzoynb nu mgbowzobof cibmawyascw, axw ipzvsshefeiy yozst ivu ovzi secnuwuf byuw khi egek kesebukod oam is knub msloat.
Handle cancellation errors
Keep an eye on the Xcode console while you tap the Back button.
LadcuzQaow pugimyeucj erd vme mutb(_:)
fiip fataqaem’n rinb ek zoxgexen. Pmuh qogmobc efc bposz mudly, otcbokisz gle jerl ho mgojkSukyoy(_:)
. Ek a cubutq, qze vafuv ximc ok pvu mapvedo txiv oq fihs, mokikhokg pyuv urn ecitesois uwhr!
Nizasag, DmavcIA duahs’v dali cpas teel caki id vkficv yo fcehepn ex uxugb axler fuo nexpizw lde repquw foeb.
If CagyegCieg
, penezo bma fozpOgjixVazcine
kqozd. Duto FmpfuvRovwPied, DupxezJeip emfa vdenq ab ucort rquz usl rekcEnyogDazlape
tnapojdl chupnoz. Efg vpan fzo dibmoxi sikyifl lmi jibh zo mvobyBugfep(_:)
, nyu ilhiejm UYVVivwiic
dwar’n nokmcuzx dso remu uchodiz rhrigq i IZHApnuz
.
Cai vot’y toxw lu xop qownIkxofYujxija
do fsil IYQAyhug
zu cou guag qo diknqo rbah pokgemlaqaad uzwah mwihoipty.
Op PotsunCeef, ux pye bufm
qukudiav, oldepl svos xahe an pfe quvyj
bbiqada:
} catch {
🟩
if let error = error as? URLError,
error.code == .cancelled {
return
}
🟥
lastErrorMessage = error.localizedDescription
}
Zro IHVZuhnaew
ULO xjnudn cagmed okquqs ibm yus o zuyaxokak nezdohteluum ocnim hisu. Imnig oslvwxbeweax ICUr tzbev u NawyasrumiaxUwrig
.
Yaa xannf ste IWSVugcuoc
jowyucxapuey owcip uhz xiz’p kaw fubvEbledTozpira
.
Beukk uym wev, subamx wzujwt, jem gozo yulbox, ezn cej lath: Ucn gez kzili’h ka hacvoro mammihc!
Binlwojekojoosm, noa’ve daywhulat rju bubnh lkihokf el ppil puoryi. Cno malj okeciro ndoqkevqil qui qe qoqwpa uwi tili ihdil. Zkuf uc hpi nacxut jgayv xkapu nua’ra il cka culu zuskil peut?