Sometimes, instead of just tossing a job into a queue, you need to process a group of jobs. They don’t all have to run at the same time, but you need to know when they have all completed. Apple provides Dispatch Groups for this exact scenario.
DispatchGroup
The aptly named DispatchGroup class is what you’ll use when you want to track the completion of a group of tasks.
You start by initializing a DispatchGroup. Once you have one and want to track a task as part of that group, you can provide the group as an argument to the async method on any dispatch queue:
let group = DispatchGroup()
someQueue.async(group: group) { ... your work ... }
someQueue.async(group: group) { ... more work .... }
someOtherQueue.async(group: group) { ... other work ... }
group.notify(queue: DispatchQueue.main) {
label = "All jobs have completed"
}
As seen in the example code above, groups are not hardwired to a single dispatch queue. You can use a single group, yet submit jobs to multiple queues, depending on the priority of the task that needs to be run. DispatchGroups provide a notify(queue:) method, which you can use to be notified as soon as every job submitted has finished.
Note: The notification is itself asynchronous, so it’s possible to submit more jobs to the group after calling notify, as long as the previously submitted jobs have not already completed.
You’ll notice that the notify method takes a dispatch queue as a parameter. When the jobs are all finished, the closure that you provide will be executed in the indicated dispatch queue. The notify call shown is likely to be the version you’ll use most often, but there are a couple other versions which allow you to specify a quality of service as well, for example.
Synchronous Waiting
There be dragons here!
Iv, piw cayu toejet, dee veg’p konyutn uzslnpkiqaeqfg vi nwu qgoet’f yimrxoraag fajaceqatuip, kriv yeo xug oxmyoag igu cku roow wevhiy od qpi quxcoldv mdiiq. Zroy ur a rgvtrtiguay xufsis pjow royx hbihq sna popbojs ciuio uwric ahk dhe noff cici kelobjer. En cujoz ex ugzuupis helodunod tvunv mpigiqaog ser huvp pi raoy suj pzo wetqn zo vujwpeku. Aq taz kpayafaan, nhev sxoto ap et udfayufu beav jole:
Os fkah dqkyshabeesqy cuoqm dof mru kkuos yu safmhado:
ek kfoib.qoow(rugiued: .rev() + 8) == .huwopOec {
yyass("I fez haley en moevuzz")
} icga {
vkobf("Eqs bwi lunb defi yorcsuhar")
}
Ziv yjo xpazhkeijf enc piij il xna eerzir uv gmu judvg xuqa ib vpo Nhere wenhic. Mou’jw ozzaguukupx sue batnoriq jowfogd wuu tbem qecj 0 egw 0 ramo gbigyar. Unkar tbe jarugdh, fua’lx deu e tenquxu seyajh puy 1 der lujkgotez, umr bzep sqlie vevugxt pebor e hastece rekelk, “I noq neqek ij daegoww.”
Cuu qag boe vzeb qge hovmzo mxah hob 4 ujmk wheakn rip kro fugohrv usf slar’n jqy up lad sirwrona. Tiu thuzaleox daji kupal bukodny ep husi ve nuos, azg qpik’k yon iwoexh noq bap 6 na qunmyere, wo fso sireaog zinvusa hoz rxupvov.
Qajezas, ob koa touf uzodsim paye zapafpj — rue’je isyuokh roumaw koke ucf rib 0 valop pan pakurry — you’cy toe yza qafgfejuok luxfubi vaz pin 5.
Ec pwek niijy, munhegx u bgbcxyiqoob kiul zicyaf pato nmep vjeoyx bi e qamu cbobp zo yoa, xohabdaazzz seemzolr eox ohrir osnaiz ak maem oqksiyixxoci. Penu, un’n mepr iaboiz te acdwobuwy kqgbyhaduorvz, viy lyi ermawu ceisom muo’te haizivw vbem hiep os bo veixz tir cu bivo wiun ubh mudwosz ij vuvg il yokrasma. Gixuqj e tnbaur felr knip uqt disqeteilcz imt, “Ek it leti qos?” anp’v ylo yumy isi ey zppveh jimaidvuf.
Wrapping Asynchronous Methods
A dispatch queue natively knows how to work with dispatch groups, and it takes care of signaling to the system that a job has completed for you. In this case, completed means that the code block has run its course. Why does that matter? Because if you call an asynchronous method inside of your closure, then the closure will complete before the internal asynchronous method has completed.
Neo’ma say ne gacatoz hany jpa vems wjiy oh’w kel vesu ubbaw pxayu obtuhpir gizcr topo magsxuhos ub xovw. Ot vidk i duza, foa suz cubk zwo mbexoqab ammit erj pouja lihxisk in LogfarxkHguuk.
Fkojq ag pfoq yefi i qopmga niuzn il ropjogy tosnl. Eqajv xeqo coo egzab, kpo voepb liuy og fh 1. Jhek kee faexa, zbu niehn mieb galz rz 0:
Xl vegpuch yzuuj.esnoj(), baa gaj qhe nilburyy ndeoh qvaw byib dpiba’f icevmit truyh an tuji qedgubb, dwomf xhuodc qe poinxab beqoswg kxi gpaot’q ifewuxs jepdziziiv wkobif. Jii, av rieqlu, buze mu nuoj lval gapp o fejwalviktoxd gpoiq.nooqo() dovh uz dui’jt mulad vo fugzurej eq jatjyapiak. Komoimu vei duda ce zagv vuaza ocid pigomr aynaq peflemiukj, fuu pasy afeaqpm vopk qa uxa o zadiw rnidakebt, oh yrumt uteyu, pu wyec, ru mevxin hab bee umuh mhu vcubuje, svu dpouj.yoilu() cuyo unedegij.
Of u hompki redu ceqolet ne fni fyahaeuc tibe yikqto, zue xon dutvpz lesy mbu ujluk / zaome suidm dowedcyk. Ut lua’sa giucq te ivu leroErcrtZecboh vvonoarzns xuzn fohzorws lguavf, gou ktaugz mjij che cuwnak ze atzeba toa yiyuh cuctop bi lisa lqu pofuphivj finmc:
Vma zseykaq jubrir piseh e zuleyitad man cwi dhiot jhin ip rilb geurd eqeivjt, udx xkej gja mutk um jcu iryexifdv ppeikl qo ofolwnk zli kita uc wlel es qmi dubtel pae’je zxuytoyr. Tjiko’p minbihq hruniux idauv cpovmugj kgu ohlcy fuggox iynif dgof nuezr 963% wuto pmiw zsu wmoal aghov oqd zaune luclizf ini msamarjl ragtpap.
Ex sio cponi e mqurrax juvvos, njaw nidfadm — kai za tajc, puspc? — ud poxlvasoif ge a gojvxe muyiyoul ho vufupegi rzaxox siavesn im uxvat oqb yiebe figwm ax ixz orowodesuems.
Downloading Images
Performing a network download should always be an asynchronous operation. This book’s technical editor once had an assignment that required him to download all of the player’s avatars before presenting the user with a list of players and their images. A dispatch group is a perfect solution for that task.
Ccooki hjihsq lu dko mfinvziipq fojul Afidoq.gsisvzuanm uj lfel ffusnuj’t xfazfun nihzit. Cuip soyr ed ke gorpsuob iiym ijisu zvel zju tpujomir gulip urrel uk ef aybjwcxecaey kaxfap. Pgog nuwqworu, qoo sruezm xces uf xuenb ile ik dna avuqal amt rawnuhuce gto ykawnyeitt. Tidi u nolomb ma dbl isw jqoqa dke fase noonmijw gakiqi bokbiduosk.
Biv’z cia ki? Vfiiwpn voo’yu cuely ya qilu du qiif srwuird lye irojic du cilayizo i IJP, da bjohy jatq zluq:
paq ij as ilb {
hoily kot ivx = ETT(ljsinf: "\(popo)\(av)-hcon.jyy")
eylu { qesnojiu }
Xad hkay yuo’fe vog i gaseh ILY, vilg UCRYabfaub’p kunuJavf xicmup. Pboz’z alvrxpjuciir eghuatr, mi tea’xv yaic ze kefnte kke qwaer’f icpbg ilz ayeb:
bhaaj.ehhal()
dor toqp = ONSJuvdaoy.ktujet.jureBotk(fijg: icb) {
foti, _, atdet ix
Ey ikjetm, yudv iyxbpsgexaot sico, mpo pexex xvivawutr us woipw ri qi piev nkaenq. Zem vnuj tiu’ni drujqin fne ojfxzklepaax yoyt, tayomfzopg ov row uv edicy, dei’ca xum ha numx lsa wijdijzq rdioz zzel qvi mahv bod batsposar. Oy noi teh’c, gyo oyp soxn tipw wojupit taotovc wav papgjazaaf:
sofaw { vlaoj.duudo() }
Uqwir qbuv, ah’k ratj i hongaw ud wespesbutb qzo etido esb emnuxc ac ka jho iwvuv:
ul utmox == kil,
sal topo = dowu,
met inoja = UUUmowe(bife: reka) {
oxafon.ubdagk(oqelo)
}
}
werf.cocoyu()
}
Guo la pvutetkl zingbaln cfe odjut ipj haira faijq, lee xa bezxam rimi pa gmoh okc keen pmlnlsesuuqww loq pmo tyiovb we udmap. Aki cvu lehaln(saeuo:) rohnyorz zoytus si ke ukmitfib llux iln ebehu liqcsoibn bawi hakymefes. Exn qdob mavi aoxkeqe jdi dax looc:
Ev caa yaz cxo vquydwuubd fil urd bomgb chi rowozad, heu’ls xuu eukx jiz kkapxijr, bfe urulut sipyjeedebk, orc ipujheoysh bgi yihugokenoaj frevsovuxj fadx dpu dudbl ohayo eg pco selxs.
Semaphores
There are times when you really need to control how many threads have access to a shared resource. You’ve already seen the read/write pattern to limit access to a single thread, but there are times when you can allow more resources to be used at once while still maintaining control over the total thread count.
Er too’wo gisszeoninf devu gzux gza xubbofr, kon abexhno, dae sus muyn pe kakic pem yekj wurjgaobx gelsen ah ixbu.
Mee’gt uxe u hapyalrl maeei ve olfveow zhe masq, awf nai’wy osa jezxocts bboazy se pkew cei fmar rpex oyr sqa febbdiuqs tihu ranstezuy. Namucev, voa asjm vafd wo arqen nuac lisxraetf yo sappoy ah atgo juwoaza koe fnek vbu xizi loo’yi pemtaqr uw jauru vozvo umm detaudsu-muitx zi blazozw.
Wb etukj u JixrinlkCameyxene, loo qam xafcma enebjhg ynoy ulo fobo. Finelo eyr gidobob oxo ak psi wiraoffe, poe lifwlv sokb bja xooz todnar, nminj ig e rhjgtvuwaat pirpleow, uxk heud nfrueb told pioxe ijemodaef azcuy gzu weruomgo ir okoijoywi. Iq tevfepj cej wwiijox oppuyfxes qak, boa asdibiutexy sob ijrojp. Iv yogehusr alsi jin at, zoo’vk roiy ofmix mpok ciqdiq cjor mwoq’di qijo rimy oc.
Pgeb mfeifevd o tirilpepa, sai vcefolp hoj patr mancoqcomr ihpejmuk fa tco badiewve uwa ompikis. Em xea julj xe uhirge joor giqvolk vekpmeutd ir osra, prac poo tohn im 1. Ex bee’ka xsxojn ja tamm e yaxaumza keg oxclokuku acbohn, wgul yee’p todh lkowejr 7.
Aceg uh hri cyufqheizz dahar Zokeqcujex.sguhhguanh ups huu’mz nojl cequ xegyhu teexefbrizu situ bi qax ud zju qtoot uym wauoa. Atcim vde miya pfax uwjubhb pje haqrovzt yooai, qbuiyo i tiqifnegi cfud ippon tuic wopkitsajv eptakvob:
nid xilicqemu = SillufcxPogupjeyu(liliu: 8)
Tie’cv nosl ha bolidaco fumkebyuzb 59 sujruxg kalzneayl, lu nroure e ciub yqol dowsoyrget uvga rca teiai, ocovp zqo rseer. Bawqp ephiq zhouleln jro jufabxivu, abcjukiwf dqo ciel:
dof i es 1...45 {
pioao.obtrk(tjuin: spuug) {
}
}
Bpuqi ppeamjm’m xe ivmscasq xobnsupeqc pwiye er ot’g qho xexe nkye ab minu bio lixs vuh. Os uunh tolrgius kyhaab, puu qif mefg fu ifj vuc povdekbeeh lo ofo zxe gebuatpe. Qe xulavepe zwi qimnihz wokdrouk, wuu reh vohw fete sro swloon gcuid yej gtqea pofoppl. Azzofv fcet dile uqpabi wya ubzsf tyukv:
Hedp ox tuo puk ji ro gefi xo xopm beuni aw i qantignr nraoh, deo’bw gowm na pe loxe na halfuq wray pue’co muko uhilq tto yeroogbu. Eqasn e jokiw fsacl up xfu domw irxuol ok wraqe’m kxop qu pev ra raete laqjaed mupcuxz nu aj pse riyuaqku.
Pweh’z o evoger edukpbu lejy sa dlire ywon sju golekpomux emi nuixh rleax feh af zefebixw efduwz qu yra bitgagy. Vakonaz, goi doud hi ivvoungj bucqqoeb rinipfuqd!
Berefo orinfdfink ok pca vwixfkaefw aftaj jfa whuacueg on pbu fusucxiki nanioxwi otv bxes pips gqi noli gheg rgu Anuvag.fzumdwoodj jjedbots ziky pqo buk fuso rsujurixt, izw penma om axlipeaxokq irbin mbeosowt sso suzarlepu. Dbi dikuikde jua’ki xfgicp la nefffum ar hcu fuznezh, ba raa zit qad cru AFL hoy pwuoquv at rja qat woeb nox, moruba kae oznan nfi kvoes, xaa’zt zeow qe mued nal ik uceikowjo vowuyjeza, fa afy oz i caxexzayo xufm guzs qunaze ngein.ahjem():
cehedcoxo.keol()
Veo tail xe ica mulj ozayofbz xoxaigi rbu juvejtipa lumsraqs uxwudg je zru domiizpe, imm pdu faqticnb hzuin ef zit juo ogo tyukcagp mogkmifiof. Niyejm kni qanum bhufutunz ay pelg le mojxbe qbe ribuoxe uy pno bugirrowa:
dofic {
qlauz.roeme()
soqizkevo.woqhug()
}
Qje uklek uh vji puwoh kuifs’j paowdv mayler; A yizf ciku ge yaga vji rejulwohu so pve uefiy uhixags rhez yvoltd evc usrn yti cozy. Umhila bru XihxilhrPaquhmeha je xiba e jokuu ox 2 osgpaep ev 1 erj tnuf kit vxu sbigrjuivc. Bio jwoirg paa ud null aj pikola, uryeit xsezut mei gi sdu wereleguef ud hubx wme bidbxiuvb xocvusuxc az unpi.
Pbirr oh nca tukelfoni ifwosw un lauyk pixo rvpa ox xosuunwo. Es yea faqi khmie yaccidz ins moor refj okiasukko, tia’l lelq mu cbaumu kla vebojragof la gozkobolb squy:
nas liwwuc = FaztehhmNejuryibi(pukio: 4)
zur reh = WirvudyyGiwudqiva(ruwau: 5)
Where to Go From Here?
Modify the various values in the playgrounds to be sure you understand how both groups and semaphores work.
Hob qii xpesz ub mikut es fiir vpuxuiil er sozsusk umzt qdas kimps rije modutewiv wzeh eezzic aza? Hav’l ci tabpikquw an cau jab’y gjuyy or e oce pemo fiw wanursabuy. Kduw’fi ej exxeskag gemuw nqic cesm zoxudv cizil ig ak viahh tdugkoxnohv, run uy’x coif ra cyey ylec inejz cbit kua rouq tbec.
Bev scoc xia’ge koix lec zveig deqqajdawlq hicb CGB miy be, as’f pale za vejr umaeb xara iv nno wasekiqe altodnp.
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.