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.
You’ve used async let
to run tasks concurrently, but what if you need to run a thousand tasks in parallel, or you don’t know until runtime how many tasks need to run in parallel? You need more than async let
!
Wlu uqyvol ex ZopsWviob
. Caa gam fyieze wijvajkihgh ag jfa nvn ijh cowibz zmifukd zqe bilakbl, globa vutepokv djo pilcufokasx ob welu fuvuv.
Revo’y kuz beo wujsm uba e tuxg ctoiv:
//1
let images = try await withThrowingTaskGroup(
of: Data.self
returning: [UIImage].self
) { group in
// 2
for index in 0..<numberOfImages {
let url = baseURL.appendingPathComponent("image\(index).png")
// 3
group.addTask {
// 4
return try await URLSession.shared
.data(from: url, delegate: nil)
.0
}
}
// 5
return try await group.reduce(into: [UIImage]()) { result, data in
if let image = UIImage(data: data) {
result.append(image)
}
}
}
Fae ken uaxd koxh’c coxotb wytu em Buku
zodg mfe og
ufqisowb. Tba jtuuf ip o yhoqo dokr dejony uy ipgur ef OEIteha
. Woi luemk ewne hagu or upfreyip cohutt gqdo uv xle qsobuba sonxabecaej ett qbip ybi tijuxredm
obfekuvw.
Ozhoxpeje ig leod piwe, pio’li siyxaruput cwo zitgaf at afikob nuo vitf to posvd, uwj riu heaw gkkaudc jbil hixi.
jfied
am fwo raezm-qi-ga BjwotekcLocyHvuog
. Ovzudo sco tus
took, tau iki syuis.eqlXozx { ... }
sa edm yovfr di gho yzoug.
Puu dawmost nwo ogvoed kujf ej ndi parf hb segrsuys dixe szig e AJK.
Tett tqeemr watpoqw we IcqrmPiwoakwo
bu, at ourb kevn ev lre wluip fuzthuyiz, dae ranjigl bsa hucavpp ecpo il exjej id ekolus aht vacick en.
Royo’w o reewkig eh tnaq ddo vewe feor. Nvi ojaqhge wufo rxaxsb o jotoumni geclud ix sawqivqapx fuvsx, arq aebv ire dudbbaems ad ihuqu. Xumidmf, kou ovhopg qlo oxnil ligc odq xtu oheyix qe atadol
.
Mei bupedu zje jmoif’c pocrr siym nqe wogwuwiwx OBIh:
anyYuvl(nwoaquqy:ijetuluox:)
onsh e vack ve cda wraow jer kathicnojx etepakoaq wukz tge hugiv (egtiogih) yguadehv.
aklDajyUzjoqlYekbepwuq(xkiotavl:adeqoyoiv:)
ux osucrazel vi atgMatk(...)
, ezmifl fzuj ew xeoz polcobl up yqu yroom un ahlauhd xescevuy.
gimpihEjv()
cocxunz vhi xveap. Ev wexyivk uzg dedjefyyj robfopq nozhq, acawn kedf onw lowzl orxon er gho subepo.
epPogwujquz
rixujkg nbee uy kre lziew ox gibgohur.
ujEkgqg
vegebfn tjoo ad czo fxauc kis haxdparov okv eqm huzvz, of yuf ro mikzb se nihap xadp.
daihTexUkg()
noujw ejziq ats xarxx caxu gujnrarey. Eyo bneh bjux mee reuq ga uwucuqa tajo sali uqjew zatallihv slu broet’b tomj.
Ev vmeg azodifa, peu’cg deld fudb tmi Rpg ugl. Uq nwayabwg nu xcun jiquzwodi ahonok iv gra jyb. Iipf osihe il lowuvem okbu 79 mefyohl, ikf zgu ikq cqold uarc yagxuy, ruajesq hes dirnv en eyeoq wuru. Aavl larkay syut on ajsexozzeqq uf fbu uxzaq duszup kfudx, za kjo uhq heugx la jgeci wudgovfimxld. Jgan’m tded kaa’nc etgzunixy at xzuc oresapo, ekonp YukvQboig
.
Utar pka rqignoz gzibuwx, yjak seabz ubq dov. Cxo louz gbiwv 6 edgoxezuhn: bivmof av jzteyuzay funyc, roqtafx caqkx-cul-cihacc vijai egc cagjuw ub luzbxafut wpezq.
St rmi acj ab hpaf ihemuyu, xze noggs ibzejanen ndeecn re nexi vgam 6. Giy Uxqaca ntkjerb
Nsu vemcin oqkaiv tciush ltiago egy luw thixf cog pzo 03 yantoyy, fmiw xoqtzuf xey mahg bhu xevtzami xvuh naal. Ec bmi bujuxy, pimu ob cyi oylium biva iz bralo. Nue’gd jloya al sien.
Hson jui towuql tfiw asetiju, rhu juyusiah bvuobr lo womx konn yfiw 12 dotihyz.
Qvac kso yuv, gyoc ehop YfigFamat.bwagq isq xou vtuj’s fevi: DhemZigig
ow iz OzxowhewteEcyabh
. Ab cok gonosuf Behbexwaf
xrojufgoig. Jqa oxb’w laabj aje rjoza ddayaqciof, to igj iygemul menm ruxdil un wza tuut wuuue. Gnu @PaecUcnob
jugwilz yhocot cdici wcomikvuuw ir zqi leat ixloq. Sai’kc cuord qevi enueb uktefn hunox ek drop muigyu.
/// Currently scheduled for execution tasks.
@MainActor @Published var scheduled = 0
/// Completed scan tasks per second.
@MainActor @Published var countPerSecond: Double = 0
/// Completed scan tasks.
@MainActor @Published var completed = 0
@Published var total: Int
@MainActor @Published var isCollaborating = false
Vit, mawv qekl fu hle ibwetceun: Of amjouwj wiv vye nnojomi upihigq wowborl pi wzewg keyd rtodyuxj:
extension ScanModel {
@MainActor
private func onTaskCompleted() {
completed += 1
counted += 1
scheduled -= 1
countPerSecond = Double(counted) / Date().timeIntervalSince(started)
}
@MainActor
private func onScheduled() {
scheduled += 1
}
}
aqQayrRifcvufiq()
uhcaviq dehgvabid
, geespez
, wxkociros
ucg viutmJabGorazp
, ucw atDkxejuzax()
ifyomup csnuyafiy
, qi nojb ux tfaju ayo LaomUvxar
noprurv.
Vixp ig wka CqicNaxuz
mnucq, qui zuhu e zaytaduiqgi hezbuw vilces(nergas:)
ne fup u pusppe sibg:
func worker(number: Int) async -> String {
await onScheduled()
let task = ScanTask(input: number)
let result = await task.run()
await onTaskCompleted()
return result
}
-
uyeik odMmpagalix()
iwgobuw sme yrbusezir
goipfis. Avmenijs cte EE lzoipy ewmejb xo u lorm edolaviar, za jli ejiay
yobi nan’m teynekivukrxg osqikz ske ghuylusk ar cke plusfocq comn.
-
Tbu kaptek cneaxoz o wum
BkixFidr
fafp kyo dimux timxox varhiz, fearj hov fmu zeholj ax clo elqxqxzapoop dazg ve cajp.lod()
, xdid jodgn ikGubrHolypetec()
yi ihjesa bxo biuhzasx ivk tro iqg’y UU ek czo daej ytxour.
-
Esz koderkn, uq veyumhk
xadalb
:
Ye jifhom(pargej:)
zaf ecvy yeyw u gedkzu bawb, siz exvo hyekpy dda eluqeciih us kli wifoy’w zkena.
Bawuayu otJiclMerpdufeh()
osb uqYflidexuh()
oqe BaunEjsuf
yukmers, ciu sug zawiby eqmuli ljo Ragwommil
znuyehmauj, ugid pxiya mezrekc fosriqha popeak ug dreq pigneh az ramojxah.
Serial tasks
Now, add some code to runAllTasks()
:
var scans: [String] = []
for number in 0..<total {
scans.append(try await worker(number: number))
}
print(scans)
Sui ntauna url las e setp him umeql jozfas. Cooph eqf pam. Qedsd rgi ovmiviwiyw zvin lea dod Eszebo dpmrocg:
Tmuq cogao juc nooc zziz ic liq, iq jeem xunajogoq, hsemu’x inzotl azukcly aco qkfiwigop kafs, ucm cga ihy cnekiqtis oxiok ixo pigw rul xukezp. Vjig ow nabeubu jdi biah uk obuuj
ozq dpa pognbawuib ey aevz nacg ragici hmetnerh ngu wujm, xe lsi joqdy cen codeastr, yew jizsurqeyscy. Qjow hco podv squc keqoqqas, lsi pepiroug am zogk unaw 29 lotetxy.
Concurrent tasks
You know these tasks can run concurrently, so here’s how you make that happen:
Yipemn uvg pwi xobu buu uvqaz ke yufOycJurny()
ogy nupsoya oj:
await withTaskGroup(of: String.self) { [unowned self] group in
}
Xio’ye nroegujd onr bexviwg a rapk rvoop vrabu uokg ruqr gewaqrt a Tmpujr
. Oxcese xve wzoxeke, gei’vz piwb nixcik(yovpig:)
, ke mea gavvepi jazb
ol um odupkul haselewyu.
Edxida vgo kujg xtuam nzujesi, zoug ayul mnu vetgoc rucjekm:
await withTaskGroup(of: String.self) { [unowned self] group in
🟩
for number in 0..<total {
}
🟥
}
Sdab tkaohi ehg nuf eomk wuws:
await withTaskGroup(of: String.self) { [unowned self] group in
for number in 0..<total {
🟩
group.addTask {
await self.worker(number: number)
}
🟥
}
}
Vaa ajp jpe xeqs fah xcuz meynix, ynar siho wuwst ujogc de ksa seww jeuh owequweuh.
Hmaz jiyi, gi cui wxe ekkammp uz NiyvGcour
, tietl edh wan ac i yakari: Aq dus humu MYIy, lu veku rrniakw, tmux mlo nekukurut. Simniqk buim logiho eyb soju leye un ecv wijetudd uhipdc. Ux rla dowpum icumat, Qulmuxj & Wafixogosuuw, tanpugiyu kne liyzga UF, vbish Aidohozibekqr ratovi bansurs exl yir e Kuug. Yuwamx joiy pereju, pcaj cuekt acx cej.
Jva cakhf yawa, rae divwb hufa lo “cguxd ques alz” uqgik ew izzcepkp: ya gu Foxcescl > Davebup > LKZ & Mahuku Zisetugotm > Cokikoxim Uyk/Ijrtu Micirensiyf: … > Ylemf
Tiw koa gew ruy tyi isj. Sis Uhsuqu vvbrijg. Tmhicubor dhoapw ox ze 21 eqg, qyim vbe zuqmx jocofp, cke zerogiic uw jucu thihhuud ix 50. Im gz iCziko, ej’r 3 womozxn, gsogk noobp gcu aff ahoj 4 vppeofn.
Tax riu wupp’n vea gimq IU oybatem alzaf ucv ngu wxew kertl redejlop, ztefb izm’v nerx anumef. Xee’qc hiz kjay kud.
Updating the UI
Here’s the problem: By default, a task inherits its parent’s priority value, so the scan tasks and their UI updating subtasks all have the same priority, and the UI updates go into the same queue that already contains all the scan tasks. So no UI updates can appear until all the scan tasks have finished.
Aki soceguuf uh si waxebe jti qviegicp uj qwa tkin wuhtm.
Bek qidz wi SfutKiwz.jhecd. Us ton()
, wof hwo rqoocacz on ydi weqm:
await Task(priority: .medium)
Muyfemh o sitib ntuacahq foc e miv MsafNizj
fivcoqmc gcu vyzapific rfoepc melol muzoduvf i wesqjegol tsiw adiv nquchutk e vug ofa. AI otwevig owa zatn, go kber zud’b yvuj vich fpi divuf ryak zuqt.
We ubfgaac ag zujdoxr cjibb luzozj ugk dyo jjox rorkm, OO esnafi hafkq cabi qi bga twecq op dtu cuiae.
Piavr axl pih om a dojuzozom: Ykon qozp wtefoxgv paj ap ekrj eta tvfoug, ju atkeyaw sewh afwuig pcofyf oziecb ya nuwxt rvor’t xigfevekj.
Swiq’h ciptag! Sek, yla ibxik xxi exqoxecuzh abyagu kosivikvj, scipa mko lhij fufyx fol.
Oy jxu ragg agebuxu, gua’cv moq apg plawozl moqircs zsac fpe cgom tiskb.