Thobela! Leina la ka ke Kiryl Famin, gomme ke motšweletši wa iOS.
Sehlogong se, re tla akaretša Grand Central Dispatch (GCD) gatee ya ba moka. Le ge GCD e ka bonagala e fetilwe ke nako bjale ka ge Swift Modern Concurrency e le gona, khoutu yeo e šomišago tlhako ye e tla tšwela pele e tšwelela ka mengwaga ye mentši—bobedi tšweletšong le dipoledišanong.
Lehono re tla lebiša tlhokomelo fela go kwešišo ya motheo ya GCD. Re tla hlahloba feela dikarolo tše bohlokwa tša go dira ditlhale tše dintši ka botlalo, go akaretša le tswalano magareng ga methaladi le ditlhale —e lego taba yeo dihlogo tše dingwe tše dintši di nago le tshekamelo ya go e hlokomologa. Ka dikgopolo tše ka kgopolong, go tla ba bonolo go wena go kwešiša dihlogo tša go swana le DispatchGroup
, DispatchBarrier
, semaphore, mutex, bjalobjalo.
Sehlogo se se tla ba le mohola go bobedi bao ba thomago le bahlami bao ba nago le phihlelo. Ke tla leka go hlaloša se sengwe le se sengwe ka polelo ye e kwagalago, ke efoga go imelwa kudu ga mareo a setegeniki.
Kakaretšo ya Diteng
- Dikgopolo tša Motheo: khoele, multithreading, GCD, mošomo, mothaladi
- Mehuta ya mela: ka sehloohong, lefatše lohle, tloaelo
- Dilo tše di tlago pele mothalong: Boleng bja Tirelo (QoS) .
- Methaladi ya tatelano le ya nako e tee
- Ditsela tša go phethagatša mešomo: async, sync
- Go se šome gabotse
- Ditlwaetšo tša GCD
- Dikgokagano
Dikgopolo tša Motheo: Thread, Multithreading, GCD, Mošomo, le Mothaladi
Thread – gabotse, setshelo moo sete ya ditaelo tša tshepedišo e bewago le go phethagatšwa. Ge e le gabotse, khoutu ka moka yeo e ka phethagatšwago e šoma godimo ga khoele e itšego. Re fapantšha magareng ga tlhale ye kgolo le ditlhale tša mošomi.
Multithreading – bokgoni bja tshepedišo ya go phethagatša ditlhale tše mmalwa ka nako e tee (ka nako e tee). Se se dumelela makala a mantši a khoutu go šoma ka go bapelana.
Grand Central Dispatch (GCD) – tlhako yeo e nolofatšago go šoma ka ditlhale (go diriša mehola ya go dira ditlhale tše dintši). Primitives lona ka sehloohong ke mesebetsi le methaladi.
Ka go realo, GCD ke sedirišwa seo se dirago gore go be bonolo go ngwala khoutu yeo e phethagatšago ka nako e tee. Mohlala o bonolo ke go fološa dikhomphuthara tše boima go khoele ye e arogilego gore o se ke wa šitišana le diapdeite tša UI go khoele ye kgolo.
Mošomo – sete ya ditaelo tšeo di hlophišitšwego mmogo ke motšweletši. Go bohlokwa go kwešiša gore mogaši o tšea sephetho sa gore ke khoutu efe yeo e lego ya mošomo o itšego.
Mohlala:
print(“GCD”) // a task
let database = Database() let person = Person(age: 23) // also a task database.store(person)
Mothaladi – primitive ya motheo ya GCD, ke lefelo leo mogaši a beago mešomo ya phethagatšo. Mothaladi o tšea maikarabelo a go aba mešomo gare ga ditlhale (mothaladi wo mongwe le wo mongwe o na le phihlelelo go letamo la ditlhale la tshepedišo).
Ge e le gabotse, methaladi e go dumelela go tsepamiša kgopolo go rulaganyeng khoutu ya gago ka mešomo go e na le go laola ditlhale ka go lebanya. Ge o romela mošomo godimo ga mothaladi, o tla phethagatšwa godimo ga khoele ye e lego gona — gantši e fapana le yeo e šomišwago go romela mošomo.
O ka hwetša diphetolelo tša mp4 tša di-GIF ka moka
Mehuta ya methaladi
Mothaladi wo mogolo – mothaladi wo o phethagatšago fela godimo ga khoele ye kgolo. Ke serial (go feta ka seo ka morago).
let mainQueue = DispatchQueue.main
Methaladi ya lefase ka bophara – go na le methaladi ye 5 (e tee ya maemo a mangwe le a mangwe a bohlokwa) yeo e filwego ke tshepedišo. Di a direga ka nako e tee.
let globalQueue = DispatchQueue.global()
Methaladi ya tlwaelo – methaladi yeo e hlotšwego ke mogaši. The developer indonesia khetha e mong oa 5 pele le mofuta: seriale kapa concurrent (ka default, ba serial).
let userQueue = DispatchQueue(label: “com.kirylfamin.concurrent”, attributes: .concurrent).
Dilo tše di tlago pele mothalong
Boleng bja Tirelo (QoS) – tshepedišo ya dilo tše di tlago pele mothalong. Ge bohlokwa bja mothaladi wo mošomo o beilwego mothalong go wona, ke moo methopo ye mentši e abelwago wona. Go na le maemo a 5 a QoS ka palomoka:
.userInteractive
– selo sa pele sa godimodimo. E šomišwa go mešomo yeo e nyakago phethagatšo ya ka pela eupša e sa swanela go šoma godimo ga khoele ye kgolo. Ka mohlala, ka tirišong yeo e dumelelago go retouching ga seswantšho ka nako ya kgonthe, sephetho sa retouch se swanetše go balwa ka pela; le ge go le bjalo, ge e ba e dirwa godimo ga khoele ye kgolo, e be e tla šitišana le diapdeite tša UI le go swara boitšhišinyo bja mmele tšeo di diregago ka mehla go khoele ye kgolo (mohlala, ge mosediriši a thelela monwana wa gagwe godimo ga lefelo leo le swanetšego go retouched, gomme tirišo e swanetše go bontšha sephetho ka pela “ka fase ga monwana”). Ka go realo, re hwetša sephetho ka lebelo ka mo go kgonegago ntle le go imetša tlhale ye kgolo.
.userInitiated
– selo sa pele sa mešomo yeo e nyakago ditshwaotshwao tša ka pela, le ge e le gore ga se ya bohlokwa go swana le mešomo ya tirišano. Ka tlwaelo e šomišwa go mešomo moo modiriši a kwešišago gore mošomo o ka se phethe ka ponyo ya leihlo gomme o tla swanelwa ke go leta (mohlala, kgopelo ya seva).
.default
– selo sa pele sa maemo. E abetšwe ge e le gore mogaši a sa laetše QoS ge a hlama mothaladi – ge go se na dinyakwa tše di itšego tša mošomo gomme bohlokwa bja wona bo ka se kgone go laolwa go tšwa go seemo (mohlala, ge o bitša mošomo go tšwa mothalong wo o nago le bohlokwa bja .userInitiated, mošomo o ja bohwa bja bohlokwa bjoo).
.utility
– selo seo se tlago pele bakeng sa mešomo yeo e sa nyakego ditshwayotshwayo tša mosediriši tša ka pela eupša e nyakega bakeng sa tshepedišo ya tirišo. Ka mohlala, go nyalantšha ya data le seva goba go ngwala autosave go tiske.
.background
– selo sa pele sa fase kudu. Mohlala ke go hlwekiša cache.
Methaladi ka moka e arotšwe bjalo ka Methaladi ya Tatelano goba Methaladi ya Nako e tee
Methaladi ya tatelano – bjalo ka ge leina le bolela, ye ke methaladi yeo mešomo e phethagatšago ka go latelana. Se se ra gore mošomo wo o latelago o thoma fela ka morago ga ge wa bjale o fedile .
Methaladi ya nako e tee – Methaladi ye e dumelela mešomo go phethagatša ka go bapelana – mošomo wo mofsa o thoma ka pela ge methopo e abetšwe, go sa šetšwe gore mešomo ya peleng e phethilwe. Hlokomela gore ke fela tatelano ya go thoma yeo e kgonthišitšwego (mošomo wo o beilwego mothalong pejana o tla thoma pele ga wa ka morago), eupša tatelano ya go phethwa ga e kgonthišetšwe.
Tsela ya go phethagatša mešomo
Go bohlokwa go lemoga gore bjale re ahlaahla mekgwa ya phethagatšo ya mešomo ge e bapetšwa le khoele ya go bitša . Ka mantšu a mangwe, mokgwa wo o bitšago mošomo ka wona o laola ka fao ditiragalo di phuthollago ka gona ka gare ga khoele yeo o romelago mošomo go tšwa go yona go ya mothalong.
Ka go se sepelelane ( async
) .
Pitšo ya asynchronous ke yeo go yona khoele ya go bitša e sa thibelwego — ke gore, ga e emele mošomo wo e o beago methaladi go o phethagatša.
DispatchQueue.main.async { print(“A”) } print(“B”)
Mohlaleng ona, re asynchronously enqueue mosebetsi ho print("A")
ka moleng ka sehloohong ho tloha khoele e ka sehloohong (kaha khoutu ena ha e ka hare ho moleng ofe kapa ofe itseng, e bolaoa ka khoele e ka sehloohong ka default). Ka go realo, ga re emele mošomo ka khoele ye kgolo gomme re tšwetša pele phethagatšo ka pela. Mohlaleng wo o itšego, mošomo wa print("A")
o beilwe mothalong wo mogolo gomme ka morago ga moo print("B")
o phethagatšwa ka pela godimo ga khoele ye kgolo . Ka lebaka la gore khoele ye kgolo e swaregile ka go phethagatša khoutu ya bjale (gomme mešomo go tšwa mothalong wo mogolo e ka phethagatša fela godimo ga khoele ye kgolo), print("B")
go fetša pele, gomme ke fela ka morago ga ge khoele ye kgolo e lokologile moo mothaladi wa mothaladi wo mogolo wa mošomo wa print("A")
o kitimago. Setšweletšwa ke: BA.
DispatchQueue.global().async { updateData() DispatchQueue.main.async { updateInterface() } Logger.log(.success) } indicateLoading()
Re asynchronously eketsa mosebetsi ho moleng wa lefatše le kamehla pele ho tloha khoele e ka sehloohong — kahoo khoele bitsa hang-hang tsoela pele le bitso
indicateLoading()
.
Ka morago ga nako ye nngwe, tshepedišo e aba methopo ya mošomo gomme e o phethagatša godimo ga khoele ya mošomi wa mahala go tšwa letamong la khoele, gomme
updateData()
e a bitšwa.
Mošomo wo o nago le
updateInterface()
o enqueued asynchronously go mothaladi o mogolo—thread ya mošomi yo a bitšago ga e emele go phethwa ga yona gomme e tšwela pele.
Ka ge mešomo e beilwe mothalong ka go se sepelelane, re ka se kgonthišege gore methopo e tla abelwa neng. Tabeng ena, re ke ke ra bolela ka bonnete ba hore na
updateInterface()
(ka khoele e ka sehloohong) kapaLogger.log(.success)
(ka khoele mosebetsi) tla phethahatsa pele (leha re ka ke ka mehato 1-2: e leng phethahatsa pele,indicateLoading()
ka khoele e ka sehloohong kapaupdateData()
ka khoele mosebetsi). Le ge e le gore khoele ye kgolo e swaregile ka go swara diapdeite tša UI, tshepedišo ya boitšhišinyo bja mmele, le mešomo ye mengwe ya motheo, le ge go le bjalo ka mehla e amogela methopo ya tshepedišo ye e phagamego. Ka lehlakoreng le lengwe, methopo ya go bolawa godimo ga khoele ya mošomi e ka abelwa mo e nyakilego go ba ka pela le yona.
Hlokomela gore ka go animation ye mothaladi wa lefase ka bophara o phethagatša mešomo ya wona go thread ye nngwe ya mošomi wa mahala
Ka go sepelelana ( sync
) .
Pitšo ya go sepelelana ke yeo go yona khoele ya go bitša e emago gomme e emela gore mošomo wo e o beilego mothalong mothalong gore o phethe.
let userQueue = DispatchQueue(label: "com.kirylfamin.serial") DispatchQueue.global().async { var account = BankAccount() userQueue.sync { account.balance += 10 } let balance = account.balance print(balance) }
Mo, go tšwa go khoele ya mošomi yeo e phethagatšago mošomo mothalong wa lefase ka bophara, re bea mošomo mothalong wa tlwaelo ka go sepelelana go oketša tekatekano. Khoele ya bjale e thibetšwe gomme e emela gore mošomo wo o beilwego mothalong o fetše. Ka go realo, tekatekano e gatišwa fela ka morago ga ge mošomo wo o lego mothalong wa tlwaelo o phethile koketšego.
Ela hloko: Ka go animation ka godimo, mothaladi wa tlwaelo o phethagatša mešomo ya wona go thread ye nngwe ya mošomi wa mahala
Go se šome gabotse
Tabeng ya mešomo ya go sepelelana, go bohlokwa go ahlaahla go se šome gabotse—ge tlhale goba ditlhale di letile ka mo go sa lekanywego gore tšona goba tše dingwe di tšwele pele. Mohlala wo o tlwaelegilego kudu ke go bitša DispatchQueue.main.sync {} go tšwa go khoele ye kgolo .
Khoele e kgolo e swaregile ka go phethagatša mošomo wa bjale, wo ka gare ga wona re nyakago go phethagatša khoutu ye nngwe ka go sepelelana. Ka go rialo, pitšo ya synchronous e thibela khoele e kgolo . Mošomo o beilwe mothalong mothalong o mogolo eupša o ka se thome ka gobane tlhale e kgolo e thibetšwe e letile gore mošomo wa gona bjale o fele—gomme mešomo mothalong o mogolo e ka šoma feela mothalong o mogolo . Se se ka ba thata go se bona ka leihlo la kgopolo mathomong, eupša senotlelo ke go kwešiša gore mošomo wo o beilwego mothalong ka DispatchQueue.main.sync
e ba karolo ya mošomo wa bjale, gomme re o bea mothalong ka morago ga mošomo wa bjale. Ka lebaka leo, khoele e leta karolo ya mošomo wa bjale yeo e sa kgonego go thoma ka gobane tlhale e tšerwe ke mošomo wa bjale.
func printing() { print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) }
Hlokomela gore print("B")
go tšwa mothalong wo mogolo e ka se phethagatše ka gobane khoele ye kgolo e thibetšwe.
Ditlwaetšo tša GCD
Karolong ye, ka tsebo ka moka yeo e hweditšwego go fihla ga bjale, re tla ahlaahla ditlwaetšo tša go raragana mo go fapanego: go tloga go diboloko tše bonolo tša khoutu tšeo o tlago kopana le tšona dipoledišanong go ya go ditlhohlo tše di tšwetšego pele tšeo di kgoromeletšago kwešišo ya gago ya mananeo a nako e tee. Potšišo mešomong ye ka moka ke gore: Ke eng seo se tlago gatišwa go console?
Gopola gore mothaladi wo mogolo ke wa tatelano, methaladi ya lefase ka bophara () ke ya nako e tee, gomme ka nako ye nngwe bothata bo ka akaretša methaladi ya tlwaelo yeo e nago le dika tše itšego.
Ditlwaetšo tša motheo
Re tla thoma ka mešomo ya bothata bjo bo tlwaelegilego – yeo e nago le kgonagalo ye nnyane ya go se kgonthišege ka tšweletšo. Mešomo ye ke yona yeo go nago le kgonagalo ye kgolo ya gore e tšwelele dipoledišanong; senotlelo ke go ipha nako ya gago gomme o sekaseke bothata ka kelohloko.
O ka hwetša khoutu ka botlalo ya ditlwaetšo ka moka mo .
Mošomo wa 1
print(“A”) DispatchQueue.main.async { print(“B”) } print(“C”)
- Ka khoele ka sehloohong,
print("A")
e bolaoa. - Mošomo wa go
print("B")
o beilwe mothalong ka go se sepelelane mothalong wo mogolo. Ka ge khoele ye kgolo e swaregile, mošomo wo o leta mothalong. - Ka khoele ka sehloohong,
print("C")
e bolaoa. - Ge khoele ye kgolo e lokologile (ka morago ga ge mošomo wa peleng o phethilwe, go ka ba le ditiragalo tše dingwe tšeo di nyakago go šongwa godimo ga khoele ye kgolo—e sego fela mešomo go tšwa mothalong wo mogolo go swana le
print("B")
tša UI, go swara boitšhišinyo bja mmele, bj.bj.
Karabo : ACB
Mošomo wa 2
print(“A”) DispatchQueue.main.async { print(“B”) } DispatchQueue.main.async { print(“C”) } print(“D”)
- Ka khoele ka sehloohong,
print("A")
e bolaoa. - Mošomo wa go
print("B")
o beilwe mothalong mothalong wo mogolo. Mothaladi wo mogolo go fihlela khoele ye kgolo e hwetšagala. - Mošomo wa go
print("C")
o beilwe mothalong ka morago ga go gatiša ("B") gomme gape o a leta. - Khoele e kgolo e tšwela pele go phethagatša gomme e gatiša "D".
- Ge khoele ye kgolo e hwetšagala (ka morago ga go swara mešomo ye mengwe ya RunLoop), tshepedišo ya mathomo ye e beilwego mothalong—
print("B")
—e a phethagatšwa. - Ka morago ga gore khoele ye kgolo e lokologe gape (ka morago ga go swara mešomo ye mengwe ya RunLoop- nakong ye e tlago, ke tla tlogela dintlha tše ka ge e sa ame tatelano ya kakaretšo), mošomo wa go
print("C")
o a phethagatšwa.
Karabo : ADBC
Ke swanetše go bolela ka yona nako yeo gore mehlaleng ye mengwe, ke tla nolofatša tlhaloso go se nene gomme ka tlogela taba ya gore tshepedišo e optimizes phethagatšo ya megala ya synchronous, yeo re tlago go e ahlaahla ka morago.
Mošomo wa 3
print(“A”) DispatchQueue.main.async { // 1 print(“B”) DispatchQueue.main.async { print(“C”) } DispatchQueue.global().sync { print(“D”) } DispatchQueue.main.sync { // 2 print(“E”) } } // 3 print(“F”) DispatchQueue.main.async { print(“G”) }
-
print("A")
e bolaoa ka khoele ka sehloohong. - Mošomo wa asynchronous (wo o swailwego ka 1-3) o beilwe mothalong mothalong wo mogolo ntle le go thibela khoele ya bjale (ye kgolo).
- Khoele e kgolo e tšwela pele go phethagatša gomme e gatiša
"F"
. - Tshepetšo ya
print("G")
e beilwe mothalong mothalong wo mogolo ka morago ga mošomo wa peleng (megato ya 1-3). - Hang ha khoele e ka sehloohong e lokolohile, tshebetso ya pele e foleng—
print("B")
—e qala phethagatšo. - Tshepedišo ya
print("C")
e bewa mothalong mothalong wo mogolo (moo mošomo wa bjale o sa phethagatšago, gommeprint("G")
e e latela mothalong). Ka ge e okeletšwa ka go se sepelelane, ga re emele go phethagatšwa ga yona gomme re tšwela pele ka pela. - Se se latelago, tshepedišo ya
print("D")
e beilwe mothalong wa lefase ka bophara. Ka lebaka la gore pitšo ye e sepelelana, re leta go fihlela mothaladi wa lefase ka bophara o e phethagatša (e ka šoma go thread efe goba efe ya mošomi ye e lego gona) pele re tšwela pele. - Mafelelong, tshepedišo ya
print("E")
e beilwe mothalong mothalong wo mogolo. Ka ge pitšo ye e le ya go sepelelana, khoele ya bjale e swanetše go thibelwa go fihlela mošomo o phethwa. Le ge go le bjalo, go šetše go na le mešomo mothalong wo mogolo, gomme tshepedišo yaprint("E")
e okeletšwa mafelelong, ka morago ga yona. Ka fao, ditiro tšeo di swanetše go phethagatša pele pele ga geprint("E")
e ka šoma. Eupša khoele ye kgolo e sa swaregile ka go phethagatša tshepedišo ya bjale, ka fao e ka se tšwele pele go ditiro tše di latelago tše di beilwego mothalong. Le ge go be go se na ditiro tša go gatiša"G"
le"C"
ka morago ga tshepedišo ya bjale, khoele e be e sa dutše e sa kgone go tšwela pele ka gobane tshepedišo ya bjale (megato ya 1-3) ga se ya hlwa e phethwa.
- Ge e ba pitšo e be e sa sepelelane, tshepedišo ya go gatiša ("E") e be e tla no bewa mothalong ka morago ga ditiro tša go gatiša
"G"
le"C"
.
Karabo : AFBD
Karabo e nngwe (ge e ba pitšo ya bobedi e be e le async
): AFBDGCE
Mošomo wa 4
let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”) serialQueue.async { // 1 print(“A”) serialQueue.sync { print(“B”) } print(“C”) } // 2
Mošomo (megato ya 1-2) o enqueued asynchronously ka tlwaelo tatelano mothaladi (ka default, methaladi ke serial kaha re sa sebelisa
.concurrent
tšobotsi).- Ge tshepedišo e aba methopo, phethagatšo e a thoma gomme
"A"
e a gatišwa. - Ka gare ga mothaladi wo o swanago wa tatelano, mošomo wa go sepelelana wa go
print("B")
o beilwe mothalong. Ka lebaka la gore pitšo e synchronous, khoele e thibela e emetše phethagatšo ya yona. - Le ge go le bjalo, ka ge mothaladi e le wa tatelano gomme o sa swaregile ka mošomo wa ka ntle 1-2, mošomo wa
print("B")
o ka se thome, gomme seo sa feleletša ka go se šome.
Karabo : A, go se šome
Mohlala wo o bontšha gore go se šome go ka direga mothalong le ge e le ofe wa tatelano—e ka ba mothaladi o mogolo goba wa tlwaelo.
Mošomo wa 5
A re tšeeng sebaka sa mothaladi wa tatelano go tšwa mošomong wa peleng ka wa nako e tee.
DispatchQueue.global().async { // 1 print("A") DispatchQueue.global().sync { print("B") } print("C") } // 2
- Mošomo (megato ya 1-2) o bewa mothalong ka go se sepelelane mothalong wa lefase ka bophara (wa nako e tee).
- Ge methopo e abetšwe, phethagatšo e a thoma gomme
"A"
e a gatišwa. - Pitšo ya go sepelelana ya go phethagatša
print("B")
mothalong wo o swanago wa lefase ka bophara e a dirwa, yeo e thibelago khoele ya bjale ya mošomi go fihlela mošomo o phethwa. - Tabeng ye, gaešita le ge khoele e thibetšwe, ka ge mothaladi wa lefase ka bophara o le wa nako e tee, e ka thoma go phethagatša tshepedišo e latelago ntle le go emela gore ya gona bjale e fele—e fo e sepetša go thread e nngwe. Ka go realo, khoele ya go bitša e emela gore mošomo
print("B")
o phethagatšwe go khoele ye nngwe ya mošomi. - Ka morago ga ge mošomo o phethilwe, khoele ya mathomo ya go bitša e a thibelwa,
"C"
e a gatišwa.
Karabo : ABC
Mošomo wa 6
print("A") DispatchQueue.main.async { // 1 print("B") DispatchQueue.main.async { // 2 print("C") DispatchQueue.main.async { // 3 print("D") DispatchQueue.main.sync { print("E") } } // 4 } // 5 DispatchQueue.global().sync { // 6 print("F") DispatchQueue.global().sync { print("G") } } // 7 print("H") } // 8 print("I")
Khoele e ka sehloohong e hatisa
"A"
.Mošomo wa asynchronous (megato ya 1-8) o beilwe mothalong mothalong wo mogolo ntle le go thibela khoele ya bjale.
Khoele e kgolo e tšwela pele gomme e gatiša
"I"
.Ka morago, ge khoele ye kgolo e lokologile, yeo e beilwego mothalong go mošomo wa mothaladi wo mogolo e thoma phethagatšo gomme e phrintha
"B"
.Mošomo wo mongwe wa asynchronous (megato ya 2-5) o beilwe mothalong mothalong wo mogolo – e sego go thibela khoele ya bjale.
Go tšwela pele go phethagatšwa godimo ga khoele ya bjale, go romelwa ga synchronous ga tshepedišo 6-7 go dirwa go mothaladi wa lefase ka bophara—se se thibela khoele ya bjale (e kgolo) go fihlela mošomo o phethwa.
Tshebetso 6-7 qala ho phethahatsa ka khoele e 'ngoe, hatisa
"F"
.Tshepedišo ya go
print("G")
e romelwa ka go sepelelana mothalong wa lefase ka bophara, e thibela khoele ya bjale ya mošomi go fihlela e phetha."G"
e gatišitšwe, gomme khoele ya mošomi yeo tshepedišo ye e rometšwego go yona e a thibelwa.Tshepedišo 6-7 e phethwa, e notlolla khoele yeo e rometšwego go yona (khoele ye kgolo), gomme
"H"
e a gatišwa.Ka morago ga go phethwa ga tshepedišo ya 1-2, phethagatšo e hudugela go tshepedišo ye e latelago mothalong wo mogolo—tshepedišo ya 2-5—yeo e thomago le go gatiša
"C"
.Tshebetso 3-4 e enqueued ka moleng ka sehloohong ntle le thibela khoele.
Hang ha tshebetso ya jwale (2-5) qeta, phethagatšo e thoma ka tshepedišo e latelago (3-4), go gatiša
"D"
.Tshepedišo ya go
print("G")
e romelwa ka go sepelelana mothalong wo mogolo, e thibela khoele ya bjale.Ke moka tshepedišo e leta ka mo go sa felego gore tshepedišo e
print("E")
gore e phethagatše godimo ga khoele ye kgolo—ka ge khoele e thibetšwe, se se lebiša go go se šome.
Karabo : AIBFGHCD, go se šome
Ditlwaetšo tša magareng
Mešomo ya bothata bja magareng e akaretša go se kgonthišege. Mathata a bjalo a kopana le ona dipoledišanong, gaešita le ge e le ka sewelo.
Mošomo wa 7
DispatchQueue.global().async { print("A") } DispatchQueue.global().async { print("B") }
-
print("A")
e enqueued asynchronously ka moleng wa lefatše lohle-ntle le ho thibela khoele jwale. - Re emela gore tshepedišo e aba methopo ya mošomo mothalong wa lefase ka bophara. Ka kgopolo, se se ka direga ka motsotso ofe goba ofe—gaešita le pele o phethagatša taelo e latelago ya go beakanya
print("B")
. Tabeng ye e itšego, mošomo wo o latelago o okeletšwa mothalong pele, gomme ke feela ka morago ga moo methopo yeo e abelwago mothalong wa lefase ka bophara. Se se direga ka gobane khoele ye kgolo e abetšwe methopo ye mentši, gomme tshepedišo ye e latelago godimo ga khoele ye kgolo e bobebe kudu (e no ba tshepedišo ya go oketša mošomo), gomme ka go diragatša e direga ka lebelo go feta kabo ya methopo mothalong wa lefase ka bophara. Re tla ahlaahla maemo a fapanego karolong ye e latelago. -
print("B")
e enqueued ka moleng wa lefatše lohle. - Go sa le bjalo, khoele ye kgolo e tšwela pele mola mothaladi wa lefase ka bophara o letile kabo ya methopo.
- Ge methopo e thoma go hwetšagala, mešomo ye ka bobedi e a phethagatša. Le ge e le gore go gatiša mošomo
"A"
go ka thoma pejana go feta"B"
, re ka se kgonthišetše taelo ka gobane go gatiša ga se tshepedišo ya athomo (motsotso wo ditšweletšwa di tšwelelago ka gare ga khonsule o kgauswi le mafelelo a tshepedišo).
Karabo : (AB) .
Maswaodikga a laetša gore ditlhaka di ka tšwelela ka tatelano efe goba efe: e ka ba AB goba BA.
Mošomo wa 8
print("A") DispatchQueue.main.async { print("B") } DispatchQueue.global().async { print("C") }
Mo, re ka kgonthišega fela gore "A" e gatišitšwe pele. Re ka se kgone go bona gabotse ge e ba mošomo wo o lego mothalong o mogolo goba wo o lego mothalong wa lefase ka bophara o tla phethagatša ka lebelo.
Karabo : A(BC) .
Mošomo wa 9
DispatchQueue.global(qos: .userInteractive).async { print(“A”) } DispatchQueue.main.async { // 1 print(“B”) }
le
DispatchQueue.global(qos: .userInteractive).async { print(“A”) } print(“B”) // 1
Ka lehlakoreng le leng, maemong a mabeli print("B")
e bolaoa ka khoele e ka sehloohong. Gape, re ka se kgone go bona gabotse gore mothaladi wa lefase ka bophara o tla abelwa neng methopo, ka fao ka teori, "A"
e ka gatišwa gateetee pele e fihla ntlheng yeo e swailwego // 1 godimo ga khoele ye kgolo. Le ge go le bjalo, ka go diragatša, mošomo wa mathomo o fela o gatiša bjalo ka AB, mola wa bobedi o gatiša bjalo ka BA. Se ke ka lebaka la gore tabeng ya mathomo, print("B")
e phethagatšwa bonyenyane ka poeletšong ye e latelago ya RunLoop ya khoele ye kgolo (goba dipoeletšo tše mmalwa ka morago), mola tabeng ya bobedi, print("B")
e rulagantšwe go šoma ka poeletšo ya bjale ya RunLoop godimo ga khoele ye kgolo. Le ge go le bjalo, re ka se kgonthišetše taelo yeo.
Karabo ya mešomo ye ka bobedi: (AB) .
Mošomo wa 10
print("A") DispatchQueue.global().async { print("B") DispatchQueue.global().async { print("C") } print("D") }
Go molaleng gore mathomo a ditšweletšwa ke "AB"
. Ka morago ga go beakanya print("C")
, re ka se kgone go bona gabotse gore methopo e tla abelwa neng—mošomo wo o ka phethagatša e ka ba pele goba ka morago ga print("D")
. Se ka dinako tše dingwe se direga le mo tirišong.
Karabo : AB(CD) .
Mošomo wa 11
let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”, qos: .userInteractive) DispatchQueue.main.async { print(“A”) serialQueue.async { print(“B”) } print(“C”) }
Gape, re ka se kgone go bona gabotse gore methopo e tla abelwa neng bakeng sa go gatiša ("B") mothalong wa tlwaelo. Ka go diragatša, ka ge khoele ye kgolo e fiwa bohlokwa bjo bo phagamego, "C" gantši e phrintha pele ga "B", le ge e le gore se ga se kgonthišetšwe.
Karabo : A(BC) .
Mošomo wa 12
DispatchQueue.global().async { print("A") } print("B") sleep(1) print("C")
Mo, go molaleng gore ditšweletšwa e tla ba BAC ka gobane boroko bja motsotswana o tee bo netefatša gore mothaladi wa lefase ka bophara o na le nako ye e lekanego ya go aba methopo. Le ge khoele ye kgolo e thibetšwe ke boroko (yeo o sa swanelago go e dira tšweletšong), print("A")
e phethagatša go thread ye nngwe.
Karabo : BAC
Mošomo wa 13
DispatchQueue.main.async { print("A") } print("B") sleep(1) print("C")
Tabeng ena, kaha print("A")
e enqueued ka mola ka sehloohong, e ka feela phethahatsoa ka khoele e ka sehloohong. Leha ho le joalo, khoele ka sehloohong tsoela pele ho phethahatsa khoutu - hatisa "B"
, joale robala, ebe hatisa "C"
. Ke feela ka morago ga moo moo RunLoop e ka phethagatšago mošomo wo o beilwego mothalong.
Karabo : BCA
Mešomo ya maemo a godimo
Ga go bonagale o tla kopana le mathata a dipoledišanong, eupša go a kwešiša go tla go thuša go kwešiša GCD gakaone.
Sehlopha sa Counter mo se šomišwa fela go semantiki ya tšhupetšo:
final class Counter { var count = 0 }
Mošomo wa 14
let counter = Counter() DispatchQueue.global().async { DispatchQueue.main.async { print(counter.count) } for _ in (0..<100) { // 1 counter.count += 1 } }
Mo, palo efe goba efe ya magareng ga 0 le 100 e ka gatišwa, go ya ka gore tlhale ye kgolo e swaregile gakaakang. Bjalo ka ge re tseba, re ka se kgone go bolela e sa le pele gabotse gore mošomo wa asynchronous o tla hwetša neng methopo—e ka direga pele, nakong ya goba ka morago ga loop go thread ya mošomi.
Karabo : 0-100
Mošomo wa 15
DispatchQueue.global(qos: .userInitiated).async { print(“A”) } DispatchQueue.global(qos: .userInteractive).async { print(“B”) }
QoS ga e kgonthišetše gore mothaladi wo o nago le bohlokwa bjo bo phagamego o tla amogela methopo ka lebelo, le ge e le gore iOS e tla leka go dira bjalo. Ka go diragatša, ditšweletšwa mo ke (AB).
Karabo : (AB) .
Mošomo wa 16
var count = 0 DispatchQueue.global(qos: . userInitiated).async { for _ in 0..<1000 { count += 1 } print(“A”) } DispatchQueue.global(qos: .userInteractive).async { for _ in 0..<1000 { count += 1 } print(“B”) }
Ka ge re sa kgone go tseba gore ke phethagatšo efe yeo e thomago pele, le go ralala le ditiro tše 1000 re ka se kgone go bona gore ke mošomo ofe wo o tlago phethwa ka lebelo.
Karabo : (AB) .
Mošomo wa 16.2
Ke eng dipholo tsa ho nka tshebetso qala phethahatsa ka nako e le nngwe?
Ka ge mothaladi wa .userInteractive o abetšwe methopo ye mentši, ka nako ya ditiro tše 1000 phethagatšo mo mothalong woo e tla dula e fetša ka lebelo.
Karabo : BA
Mošomo wa 17
Ka go šomiša mokgwa wo o swanago, re ka fetoša mošomo ofe goba ofe ka go se kgonthišege go tšwa karolong ye e fetilego (mohlala, Mošomo wa 12):
let counter = Counter() let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”, qos: .userInteractive) DispatchQueue.main.async { serialQueue.async { print(counter.count) } for _ in 0..<100 { counter.count += 1 } }
Nomoro efe goba efe ya magareng ga 0 le 100 e ka gatišwa. Taba ya gore 0 e ka gatišwa e tiišetša gore go Mošomo wa 12 re ka se kgonthišetše gore ditšweletšwa tša "C"
di tla dula di direga pele ga "B"
, ka ge gabotse go se na selo seo se fetogilego—feela gore seloupu se nyaka methopo go se nene go feta go gatiša (hlokomela gore go fo thoma seloupu, gaešita le pele ga phethagatšo ya sona, ge e le gabotse go feleleditše ka go se kgonthišege ka mo go feletšego).
Karabo : 0-100
Mošomo wa 18
DispatchQueue.global(qos: .userInitiated).async { print(“A”) } print(“B”) DispatchQueue.global(qos: .userInteractive).async { print(“C”) }
Boemo bjo bo swanago bo direga mo. Ka kgopolo, print("A")
e ka phethagatša ka lebelo go feta print("B")
(ge o tšea sebaka sa print("B")
ka selo se sengwe se boima go se nene). Ka go diragatša, "B"
ka mehla e gatiša pele. Le ge go le bjalo, taba ya gore re phethagatša print("B")
pele re enqueuing print("C")
e oketša kudu kgonagalo ya gore "A"
e tla gatišwa pele ga "C"
, ka ge nako ye e oketšegilego yeo e dirišitšwego go print("B")
godimo ga thread ye kgolo gantši e lekane gore mothaladi wa .userInitiated o hwetše methopo le go phethagatša print("A")
. Le ge go le bjalo, se ga se kgonthišetšwe gomme ka dinako tše dingwe "C"
e ka gatiša ka lebelo. Ka go rialo, ka kgopolo go na le go se kgonthišege mo go feletšego; ka go diragatša, e na le tshekamelo ya go ba B (CA).
Karabo : (BCA) .
Mošomo wa 19
DispatchQueue.global().sync { print(Thread.current) }
Ditokomane tša go nyalantšha di bolela gore:
“Bjalo ka go dira gore tshepedišo e šome gabotse, mošomo wo o phethagatša diboloko godimo ga khoele ya bjale neng le neng ge go kgonega, ka ntle le e tee: diboloko tšeo di rometšwego mothalong o mogolo wa go romela ka mehla di šoma godimo ga khoele e kgolo.”
Se se ra gore bakeng sa merero ya go dira gore dilo di šome gabotse, dipitšo tša go sepelelana di ka phethagatša go thread ye e swanago yeo di bego di bitšwa go tšwa go yona (ntle le main.sync
– mešomo yeo e e šomišago e phethagatša ka mehla go thread ye kgolo). Ka go realo, khoele ya bjale (ye kgolo) e a gatišwa.
Karabo : khoele e kgolo
Mošomo wa 20
DispatchQueue.global().sync { // 1 print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) }
Ke "A"
fela yeo e gatišitšwego ka gobane go direga go se šome. Ka lebaka la optimization, mosebetsi (labeled 1) qala ho phethahatsa ka khoele ka sehloohong, 'me joale bitsa main.sync
isang ho deadlock.
Karabo : А, go se šome
Mošomo wa 21
DispatchQueue.main.async { print("A") DispatchQueue.global().sync { print("B") } print("C") }
Optimization e dira gore mošomo wa print("B")
o se be enqueued eupša o “spliced” ka gare ga khoele ya phethagatšo ya bjale. Ka go rialo, khoutu: .
DispatchQueue.global().sync { print("B") }
e ba yeo e lekanago le:
print(“B”)
Karabo : ABC
Go tšwa mešomong ye, go molaleng gore o swanetše go šomiša main.sync ka kelohloko kudu—feela ge o kgodišegile gore mogala ga se wa dirwa go tšwa go thread ye kgolo.
Mafetšo
Sehlogong se, re ile ra lebiša tlhokomelo dikgopolong tša motheo tša go diriša ditlhale tše dintši go iOS—ditlhale, mešomo le methaladi—le ditswalano tša tšona. Re ile ra hlahloba ka moo GCD e laolago phethagatšo ya mešomo go ralala le methaladi ye megolo, ya lefase ka bophara, le ya tlwaelo, gomme ra ahlaahla diphapano magareng ga phethagatšo ya tatelano le ya nako e tee. Go tlaleletša, re ile ra hlahloba dipharologantšho tše bohlokwa magareng ga go romela mošomo wa synchronous (sync) le asynchronous (async), ra gatelela ka moo mekgwa ye e amago tatelano le nako ya phethagatšo ya khoutu. Go tseba dikgopolo tše tša motheo gabotse go bohlokwa go aga dikgopelo tše di arabelago, tše di tsepamego le go efoga mereo ye e tlwaelegilego go swana le ditšhitišo.
Ke tshepa gore o hweditše selo se sengwe se se holago sehlogong se. Ge e ba selo se sengwe se sa dutše se sa hlaka, ikwe o lokologile go ikgokaganya le nna bakeng sa tlhaloso ya mahala go Telegram: @kfamyn .
Dikgokagano tše di lebanego
- YouTube kanale le ditshwantsho tsohle - https://www.youtube.com/@kirylfamin
- Khoutu e feletšego ya ditlwaetšo - https://github.com/kfamyn/GCD-Tasks
- Thelekramo ya ka - http://t.me/kfamyn
- RunLoop - https://developer.apple.com/ditokomane/motheo/runloop
- ditokomane tša mokgwa wa
sync
- https://developer.apple.com/ditokomane/romela/dispatchqueue/sync (phethagatša:)-3segw