Salama! Kiryl Famin no anarako, ary mpamorona iOS aho.
Amin'ity lahatsoratra ity dia hiresaka momba ny Grand Central Dispatch (GCD) indray mandeha isika. Na dia toa lany andro aza ny GCD ankehitriny noho ny fisian'ny Swift Modern Concurrency, dia mbola hiseho mandritra ny taona maro ny kaody mampiasa an'io rafitra io—na amin'ny famokarana na amin'ny tafatafa.
Anio dia hifantoka fotsiny amin'ny fahatakarana fototra momba ny GCD isika. Ny lafin-javatra manan-danja amin'ny multithreading ihany no hodinihintsika amin'ny an-tsipiriany, ao anatin'izany ny fifandraisana misy eo amin'ny filaharana sy ny kofehy — lohahevitra iray tsy hitan'ny lahatsoratra maro hafa. Raha ao an-tsaina ireo hevitra ireo dia ho mora kokoa aminao ny mahazo lohahevitra toy ny DispatchGroup
, DispatchBarrier
, semaphore, mutex, sy ny sisa.
Ity lahatsoratra ity dia ho ilaina ho an'ny vao manomboka sy ny developer za-draharaha. Hiezaka aho hanazava ny zava-drehetra amin'ny fiteny mazava, hialana amin'ny teny teknika be loatra.
Thread - amin'ny ankapobeny, fitoeran-javatra iray izay ametrahana sy anaovana toromarika rafitra. Raha ny marina, ny code executable rehetra dia mandeha amin'ny kofehy sasany. Dia manavaka ny tena kofehy sy ny mpiasa kofehy.
Multithreading - ny fahafahan'ny rafitra iray manatanteraka kofehy maromaro miaraka (amin'ny fotoana iray ihany). Izany dia ahafahan'ny sampana kaody maromaro mandeha mifanitsy.
Grand Central Dispatch (GCD) - rafitra manamora ny fiasana amin'ny kofehy (manararaotra ny tombotsoan'ny multithreading). Ny tena fototry ny asa sy filaharana.
Noho izany, ny GCD dia fitaovana manamora ny fanoratana kaody izay mandeha miaraka. Ohatra tsotsotra ny famafana kajy mavesatra mankany amin'ny kofehy misaraka mba tsy hanelingelina ny fanavaozana UI amin'ny kofehy lehibe.
Asa - toromarika navondron'ny mpamorona. Zava-dehibe ny mahatakatra fa ny mpamorona no manapa-kevitra hoe inona no kaody ho an'ny asa manokana.
Ohatra:
print(“GCD”) // a task
let database = Database() let person = Person(age: 23) // also a task database.store(person)
Filaharana - ny fototra voalohany amin'ny GCD, io no toerana ametrahan'ny mpamorona asa hotanterahina. Ny filaharana dia mandray ny andraikiny amin'ny fizarana asa eo amin'ireo kofehy (ny filaharana tsirairay dia afaka miditra amin'ny dobo filokana an'ny rafitra).
Amin'ny ankapobeny, ny filaharana dia mamela anao hifantoka amin'ny fandaminana ny kaody ho asa fa tsy ny fitantanana mivantana ny kofehy. Rehefa mandefa asa eo amin'ny filaharana ianao dia hotanterahina amin'ny kofehy misy - matetika tsy mitovy amin'ilay nampiasaina handefasana ilay asa.
Afaka mahita dika mp4 an'ny GIF rehetra ianao
Main filaharana - filaharana izay manatanteraka afa-tsy amin'ny kofehy lehibe. Serial izy io (bebe kokoa momba izany any aoriana).
let mainQueue = DispatchQueue.main
Filaharana manerantany - misy filaharana 5 (iray isaky ny laharam-pahamehana) nomen'ny rafitra. Mifanaraka izy ireo.
let globalQueue = DispatchQueue.global()
Filaharana manokana - filaharana noforonin'ny mpamorona. Ny mpamorona dia misafidy iray amin'ireo laharam-pahamehana 5 sy ny karazana: serial na concurrent (amin'ny alàlan'ny default, serial izy ireo).
let userQueue = DispatchQueue(label: “com.kirylfamin.concurrent”, attributes: .concurrent).
Quality of Service (QoS) - rafitra ho an'ny laharam-pahamehana. Arakaraky ny laharam-pahamehana amin'ny filaharana izay ametrahana asa iray no atokana ho azy. Misy ambaratonga 5 QoS amin'ny fitambarany:
.userInteractive
– laharam-pahamehana ambony indrindra. Izy io dia ampiasaina amin'ny asa izay mitaky famonoana haingana fa tsy mety amin'ny fandehanana amin'ny kofehy lehibe. Ohatra, amin'ny fampiharana izay mamela ny famerenana sary amin'ny fotoana tena izy, ny valin'ny fanavaozana dia tsy maintsy kajy avy hatrany; na izany aza, raha atao amin'ny loha-hevitra lehibe izany, dia mety hanelingelina ny fanavaozana ny UI sy ny fikojakojana fihetsika izay mitranga foana amin'ny kofehy lehibe (ohatra, rehefa manindrona ny rantsan-tànany eo amin'ilay faritra hohavaozina ny mpampiasa, ary tsy maintsy asehon'ny fampiharana avy hatrany ny valiny "eo ambanin'ny rantsantanana"). Noho izany, mahazo ny vokatra haingana araka izay azo atao tsy mavesa-danja ny kofehy lehibe.
.userInitiated
– laharam-pahamehana ho an'ny asa izay mitaky valiny haingana, na dia tsy mitsikera toy ny asa mifampiresaka. Matetika izy io no ampiasaina amin'ny asa izay takatry ny mpampiasa fa tsy ho vita eo no ho eo ilay asa ary tsy maintsy miandry (ohatra, fangatahana mpizara).
.default
- ny laharam-pahamehana mahazatra. Voatendry izy io raha tsy mamaritra QoS ny developer rehefa mamorona filaharana – rehefa tsy misy fepetra manokana momba ny asa ary tsy azo faritana amin'ny contexte ny laharam-pahamehana (ohatra, raha miantso asa avy amin'ny filaharana misy laharam-pahamehana .userInitiated ianao, dia mandova izany laharam-pahamehana izany ny asa).
.utility
– laharam-pahamehana ho an'ny asa izay tsy mila tamberin'ny mpampiasa eo no ho eo fa ilaina amin'ny fampandehanana ny fampiharana. Ohatra, ny fampifanarahana ny angona amin'ny mpizara na ny fanoratana autosave amin'ny kapila.
.background
– ny laharam-pahamehana ambany indrindra. Ohatra iray ny fanadiovana cache.
Ny filaharana rehetra dia sokajiana ho Filaharana Serial na Filaharana Mirindra
Filaharana andiany - araka ny dikan'ny anarana, filaharana izay anaovan'ny tsirairay ny asa. Midika izany fa ny asa manaraka dia manomboka rehefa vita ny asa ankehitriny .
Filaharana mifanandrify - Ireo filaharana ireo dia mamela ny asa atao mifanitsy - manomboka ny asa vaovao raha vantany vao voatokana ny loharanon-karena, na dia efa vita aza ny asa teo aloha. Mariho fa ny baiko fanombohana ihany no azo antoka (asa iray napetraka teo aloha dia hanomboka alohan'ny manaraka), saingy tsy azo antoka ny filaharan'ny fahavitana.
Zava-dehibe ny manamarika fa miresaka momba ny fomba fanatanterahana ny asa mifandraika amin'ny kofehy fiantsoana isika. Raha lazaina amin'ny teny hafa, ny fomba fiantsoanao asa dia mamaritra ny fisehoan-javatra mitranga ao amin'ny kofehy izay handefasanao ny asa amin'ny filaharana.
async
)Ny antso asynchronous dia iray izay tsy voasakana ny kofehy fiantsoana — izany hoe, tsy miandry ny asa ataony.
DispatchQueue.main.async { print(“A”) } print(“B”)
Amin'ity ohatra ity, dia asynchronous enqueue ny asa print("A")
amin'ny filaharana lehibe avy amin'ny kofehy lehibe (satria tsy ao anatin'ny filaharana manokana ity fehezan-dalàna ity, dia tanterahina amin'ny kofehy lehibe amin'ny alàlan'ny default). Noho izany, tsy miandry ny asa amin'ny kofehy lehibe isika ary manohy ny famonoana avy hatrany. Amin'ity ohatra manokana ity, ny asa print("A")
dia apetraka eo amin'ny filaharana lehibe ary avy eo print("B")
dia tanterahina avy hatrany eo amin'ny kofehy lehibe. Satria sahirana amin'ny fanatanterahana ny code amin'izao fotoana izao ny kofehy lehibe (ary ny asa avy amin'ny filaharana lehibe dia tsy afaka manao afa-tsy amin'ny kofehy lehibe), ny print("B")
dia vita aloha, ary rehefa afaka ny kofehy lehibe vao mandeha ny enqueued amin'ny asa filaharana lehibe print("A")
. Ny vokatra dia: BA.
DispatchQueue.global().async { updateData() DispatchQueue.main.async { updateInterface() } Logger.log(.success) } indicateLoading()
Manampy asa amin'ny filaharana manerantany miaraka amin'ny laharam-pahamehana mahazatra avy amin'ny kofehy lehibe izahay - noho izany dia mitohy avy hatrany ny kofehy fiantsoana ary miantso indicateLoading()
.
Rehefa afaka kelikely, ny rafitra dia manome loharano ho an'ny asa ary manatanteraka izany amin'ny kofehy mpiasa maimaim-poana avy amin'ny dobo filomanosana, ary antsoina hoe updateData()
.
Ny asa misy ny updateInterface()
dia ampidirina asynchronous amin'ny filaharana lehibe — tsy miandry ny fahavitan'izany ny kofehy miantsoantso ary mitohy.
Satria tsy mifanandrify ny asa dia tsy azontsika antoka hoe rahoviana no hatokana ho an'ny loharanon-karena. Amin'ity tranga ity, tsy afaka milaza marina isika raha updateInterface()
(eo amin'ny loha-hevitra lehibe) na Logger.log(.success)
(amin'ny kofehy mpiasa) no ho tanterahana voalohany (ary tsy azontsika atao amin'ny dingana 1-2: izay manatanteraka voalohany, indicateLoading()
amin'ny kofehy lehibe na updateData()
amin'ny kofehy mpiasa). Na dia sahirana amin'ny fikirakirana ny fanavaozana ny UI, ny fanodinana fihetsika ary ny asa fototra hafa aza ny loha-hevitra lehibe, dia mahazo ny loharanon'ny rafitra ambony indrindra hatrany izy. Amin'ny lafiny iray, ny loharanon-karena ho an'ny famonoana amin'ny kofehy mpiasa dia azo omena saika avy hatrany ihany koa.
Mariho fa amin'ity animation ity dia misy filaharana manerantany manatanteraka ny asany amin'ny kofehy mpiasa maimaim-poana
sync
)Ny antso synchronous dia ny fiatoana ny kofehy fiantsoana ary miandry ny asa napetrany amin'ny filaharana ho vita.
let userQueue = DispatchQueue(label: "com.kirylfamin.serial") DispatchQueue.global().async { var account = BankAccount() userQueue.sync { account.balance += 10 } let balance = account.balance print(balance) }
Eto, avy amin'ny kofehy mpiasa manatanteraka asa iray amin'ny filaharana manerantany, dia mametaka asa iray amin'ny filaharana mahazatra izahay mba hampitomboana ny fifandanjana. Voasakana ny kofehy amin'izao fotoana izao ary miandry ny faran'ny asa an-tsehatra. Noho izany, ny fifandanjana dia tsy vita pirinty raha tsy aorian'ny asa ao amin'ny filaharana mahazatra mameno ny fitomboana.
Fanamarihana: Ao amin'ny animation etsy ambony, ny filaharana manokana dia manatanteraka ny asany amin'ny kofehy mpiasa maimaim-poana
Eo amin'ny tontolon'ny asa mifanandrify, zava-dehibe ny miresaka momba ny fahatapahan-jiro—rehefa miandry tsy misy fetra ny kofehy na kofehy iray mba hirosoana. Ny ohatra mahazatra indrindra dia ny fiantsoana ny DispatchQueue.main.sync {} avy amin'ny lohahevitra fototra .
Ny kofehy lehibe dia sahirana amin'ny fanatanterahana ny asa amin'izao fotoana izao, ao anatin'izany dia tiantsika ny manatanteraka ny code sasany. Noho izany, ny antso synchronous dia manakana ny kofehy lehibe. Ampidirina ao amin'ny filaharana lehibe ny asa saingy tsy afaka manomboka satria voasakana ny kofehy lehibe miandry ny fahavitan'ny asa ankehitriny—ary ny asa ao amin'ny filaharana lehibe dia tsy afaka mandeha afa-tsy amin'ny kofehy lehibe . Mety ho sarotra alaina sary an-tsaina izany amin'ny voalohany, fa ny zava-dehibe dia ny mahatakatra fa ny asa ampidirina amin'ny DispatchQueue.main.sync
dia lasa ampahany amin'ny asa ankehitriny, ary milahatra izany isika aorian'ny asa ankehitriny. Vokatr'izany, ny kofehy dia miandry ampahany amin'ny asa ankehitriny izay tsy afaka manomboka satria ny kofehy dia iharan'ny asa ankehitriny.
func printing() { print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) }
Mariho fa print("B")
avy amin'ny filaharana lehibe dia tsy afaka manatanteraka satria voasakana ny kofehy lehibe.
Amin'ity fizarana ity, miaraka amin'ny fahalalana rehetra azo hatreto, dia hiresaka momba ny fanazaran-tena amin'ny fahasarotana samihafa isika: manomboka amin'ny sakana kaody tsotra ho hitanao amin'ny dinidinika mankany amin'ny fanamby mandroso izay manosika ny fahatakaranao ny fandaharana miaraka. Ny fanontaniana amin'ireo asa rehetra ireo dia: Inona no hatao pirinty amin'ny console?
Tsarovy fa ny filaharana lehibe dia serial, ny filaharana manerantany () dia miaraka, ary indraindray ny olana dia mety ahitana filaharana manokana misy toetra manokana.
Hanomboka amin'ny asa sarotra ara-dalàna isika - ireo izay tsy dia azo antoka loatra amin'ny vokatra. Ireo asa ireo no tena mety hiseho amin'ny dinidinika; Ny zava-dehibe dia ny maka fotoana sy mandinika tsara ny olana.
Afaka mahita kaody feno amin'ny fanazaran-tena rehetra eto ianao.
Asa 1
print(“A”) DispatchQueue.main.async { print(“B”) } print(“C”)
print("A")
dia tanterahina.print("B")
dia ampidirina asynchronous amin'ny filaharana lehibe. Satria sahirana ny loha-hevitra, miandry an-kalalahana io asa io.print("C")
dia tanterahina.print("B")
napetraka.
Valiny : ACB
Asa 2
print(“A”) DispatchQueue.main.async { print(“B”) } DispatchQueue.main.async { print(“C”) } print(“D”)
print("A")
dia tanterahina.print("B")
dia apetraka amin'ny filaharana lehibe. Ny filaharana lehibe mandra-pahatongan'ny kofehy lehibe.print("C")
dia apetraka aorian'ny fanontana ("B") ary miandry ihany koa.print("B")
- dia tanterahina.print("C")
dia tanterahina.
Valiny : ADBC
Tokony holazaiko avy hatrany fa amin'ny ohatra sasany dia hanatsotra kely ny fanazavana aho ary hanaisotra ny zava-misy fa ny rafitra dia manatsara ny fanatanterahana ny antso synchronous, izay horesahina any aoriana.
Asa 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")
dia tanterahina amin'ny kofehy lehibe."F"
.print("G")
dia apetraka eo amin'ny filaharana lehibe aorian'ny asa teo aloha (dingana 1–3).print("B")
.print("C")
dia apetraka eo amin'ny filaharana lehibe (izay mbola manatanteraka ny asa ankehitriny, ary print("G")
dia manaraka azy amin'ny filaharana). Koa satria ampiana asynchronous izy io, dia tsy miandry ny famonoana azy isika ary mandroso avy hatrany.print("D")
dia apetraka amin'ny filaharana manerantany. Satria ity antso ity dia synchronous, dia miandry mandra-panatanteraka azy ny filaharana maneran-tany (mety mandeha amin'ny lohahevitry ny mpiasa misy) alohan'ny handehanana.print("E")
dia apetraka amin'ny filaharana lehibe. Satria io antso io dia synchronous, ny kofehy ankehitriny dia tsy maintsy sakanana mandra-pahavitan'ny asa. Na izany aza, efa misy asa ao amin'ny filaharana lehibe, ary ny asa print("E")
dia ampiana amin'ny farany, aorian'izy ireo. Noho izany, ireo asa ireo dia tsy maintsy atao aloha alohan'ny handehanan'ny print("E")
. Saingy mbola sahirana amin'ny fanatanterahana ny asa ankehitriny ny kofehy lehibe, ka tsy afaka miroso amin'ny hetsika milahatra manaraka. Na dia tsy nisy asa fanontana "G"
sy "C"
taorian'ny fandidiana ankehitriny aza dia tsy afaka miroso ny kofehy satria tsy mbola vita ny asa ankehitriny (dingana 1–3)."G"
sy "C"
.
Valiny : AFBD
Valiny hafa (raha async
ny antso faharoa): AFBDGCE
Asa 4
let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”) serialQueue.async { // 1 print(“A”) serialQueue.sync { print(“B”) } print(“C”) } // 2
Ny asa iray (dingana 1–2) dia ampidirina asynchronous amin'ny filaharam-be mahazatra (raha ny mahazatra, ny filaharana dia andiany satria tsy nampiasa ny toetra .concurrent
izahay).
"A"
.print("B")
dia apetraka. Satria ny antso dia synchronous, ny kofehy sakana miandry ny famonoana azy.print("B")
dia tsy afaka manomboka, ka miteraka fahatapahana.
Valiny : A, fahatapahana
Ity ohatra ity dia mampiseho fa mety hitranga amin'ny filaharana serial-na ny filaharana lehibe izany na ny mahazatra.
Asa 5
Andeha hosoloina ny filaharana andiany amin'ny asa teo aloha miaraka amin'ny iray.
DispatchQueue.global().async { // 1 print("A") DispatchQueue.global().sync { print("B") } print("C") } // 2
"A"
.print("B")
amin'ny filaharana manerantany iray ihany no atao, izay manakana ny kofehy mpiasa ankehitriny mandra-pahavitan'ny asa.print("B")
hotanterahina amin'ny kofehy mpiasa hafa ny kofehy fiantsoana."C"
.Valiny : ABC
Asa 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")
Ny kofehy lehibe dia manonta "A"
.
Asa asynchronous (dingana 1–8) no apetraka eo amin'ny filaharana lehibe nefa tsy manakana ny kofehy ankehitriny.
Ny kofehy fototra dia mitohy ary manonta "I"
.
Taty aoriana, rehefa malalaka ny kofehy lehibe, dia manomboka manatanteraka ny asa filaharana lehibe ary manonta "B"
.
Asa asynchronous hafa (dingana 2-5) no apetraka eo amin'ny filaharana lehibe - tsy manakana ny kofehy ankehitriny.
Manohy ny famonoana amin'ny kofehy amin'izao fotoana izao, ny fandefasana synchronous ny asa 6-7 dia atao amin'ny filaharana maneran-tany — izany dia manakana ny kofehy ankehitriny (mainty) mandra-pahavitan'ilay asa.
Ny asa 6-7 dia manomboka manatanteraka amin'ny kofehy hafa, manonta "F"
.
Ny asa print("G")
dia alefa miaraka amin'ny filaharana manerantany, manakana ny kofehy mpiasa ankehitriny mandra-pahavitany.
"G"
dia vita pirinty, ary tsy voasakana ny tadin'ny mpiasa izay nandefasana ity asa ity.
Vita ny asa 6–7, manala ny sakana izay nandefasana azy (ny kofehy lehibe), ary "H"
dia atao pirinty.
Aorian'ny fahavitan'ny asa 1–2, ny famonoana dia mifindra any amin'ny hetsika manaraka ao amin'ny filaharana lehibe—operation 2–5—izay manomboka sy manonta "C"
.
Ny asa 3-4 dia apetraka amin'ny filaharana lehibe nefa tsy manakana ny kofehy.
Rehefa tapitra ny asa ankehitriny (2–5), dia manomboka amin'ny asa manaraka (3–4) ny famonoana, fanontana "D"
.
Ny asa print("G")
dia alefa miaraka amin'ny filaharana lehibe, manakana ny kofehy ankehitriny.
Miandry mandritra ny fotoana tsy voafetra ny rafitra amin'ny asa print("E")
hotanterahina amin'ny kofehy lehibe — satria voasakana ilay kofehy, dia mitarika ho amin'ny fiatoana izany.
Valiny : AIBFGHCD, fiatoana
Ny asan'ny fahasarotana anelanelam-potoana dia misy tsy fahatokisana. Ny olana toy izany koa dia mitranga amin'ny dinidinika, na dia mahalana aza.
Asa 7
DispatchQueue.global().async { print("A") } DispatchQueue.global().async { print("B") }
print("A")
dia ampidirina asynchronous amin'ny filaharana manerantany - tsy manakana ny kofehy ankehitriny.print("B")
aza. Amin'ity tranga manokana ity, ny asa manaraka dia ampiana amin'ny filaharana aloha, ary avy eo ny loharanon-karena natokana ho an'ny filaharana manerantany. Mitranga izany satria ny kofehy lehibe dia omena loharanon-karena indrindra, ary ny fandidiana manaraka amin'ny kofehy lehibe dia tena maivana (ny fampandehanana asa fanampiny fotsiny), ary amin'ny fampiharana dia mitranga haingana kokoa noho ny fizarana loharanon-karena ao amin'ny filaharana manerantany. Hiresaka momba ny toe-javatra mifanohitra amin'izany isika ao amin'ny fizarana manaraka.print("B")
dia apetraka amin'ny filaharana manerantany."B"
aza ny asa fanontana "A"
", dia tsy afaka miantoka ny baiko izahay satria tsy fiasana atomika ny fanontana (ny fotoana hisehoan'ny vokatra ao amin'ny console dia akaiky ny fiafaran'ny fandidiana).
Valiny : (AB)
Ny fononteny dia manondro fa ny litera dia mety hiseho amin'ny filaharana rehetra: na AB na BA.
Asa 8
print("A") DispatchQueue.main.async { print("B") } DispatchQueue.global().async { print("C") }
Eto isika dia afaka mahazo antoka fa ny "A" no atao pirinty voalohany. Tsy afaka mamaritra mazava tsara raha ho vita haingana kokoa ny asa ao amin'ny filaharana lehibe na ilay ao amin'ny filaharana manerantany.
Valiny : A(BC)
Asa 9
DispatchQueue.global(qos: .userInteractive).async { print(“A”) } DispatchQueue.main.async { // 1 print(“B”) }
SY
DispatchQueue.global(qos: .userInteractive).async { print(“A”) } print(“B”) // 1
Amin'ny lafiny iray, amin'ireo tranga roa ireo print("B")
dia tanterahina amin'ny kofehy lehibe. Ary koa, tsy afaka mamaritra mazava tsara hoe rahoviana ny filaharana manerantany no omena loharanon-karena, noho izany, raha ara-teorika dia azo atao pirinty avy hatrany "A"
alohan'ny hahatongavana amin'ny teboka voamarika // 1 amin'ny kofehy lehibe. Amin'ny fampiharana, na izany aza, ny asa voalohany dia manonta amin'ny AB, raha ny faharoa kosa manao pirinty BA. Izany dia satria amin'ny tranga voalohany, print("B")
dia tanterahina farafaharatsiny amin'ny fanodikodinana RunLoop manaraka amin'ny kofehy lehibe (na famerimberenana vitsivitsy taty aoriana), fa amin'ny tranga faharoa kosa, print("B")
dia nokasaina hihazakazaka amin'ny RunLoop iteration amin'ny kofehy lehibe. Na izany aza, tsy afaka miantoka ny baiko izahay.
Valiny ho an'ny asa roa: (AB)
Asa 10
print("A") DispatchQueue.global().async { print("B") DispatchQueue.global().async { print("C") } print("D") }
Mazava fa ny fiandohan'ny vokatra dia "AB"
. Aorian'ny fametahana print("C")
, dia tsy afaka mamaritra mazava hoe rahoviana ny loharanon-karena no hatokana ho azy—mety ho vita mialoha na aorian'ny print("D")
ity asa ity. Mitranga izany indraindray amin'ny fampiharana ihany koa.
Valiny : AB(CD)
Asa 11
let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”, qos: .userInteractive) DispatchQueue.main.async { print(“A”) serialQueue.async { print(“B”) } print(“C”) }
Averina indray, tsy afaka mamaritra mazava tsara hoe rahoviana no hatokana ho an'ny fanontana ("B") amin'ny filaharana mahazatra. Amin'ny fampiharana, satria nomena ny laharam-pahamehana ambony indrindra ny kofehy fototra, ny "C" matetika dia manonta alohan'ny "B", na dia tsy azo antoka aza izany.
Valiny : A(BC)
Asa 12
DispatchQueue.global().async { print("A") } print("B") sleep(1) print("C")
Eto dia miharihary fa ny vokatra dia BAC satria ny torimaso iray segondra dia miantoka fa ny filaharana manerantany dia manana fotoana ampy hanomezana loharano. Raha voasakana amin'ny torimaso ny kofehy lehibe (izay tsy tokony hataonao amin'ny famokarana), print("A")
dia tanterahana amin'ny kofehy hafa.
Valiny : BAC
Asa 13
DispatchQueue.main.async { print("A") } print("B") sleep(1) print("C")
Amin'ity tranga ity, satria print("A")
dia napetraka eo amin'ny filaharana lehibe, dia tsy azo atao afa-tsy amin'ny kofehy lehibe. Na izany aza, ny kofehy lehibe dia manohy manatanteraka ny kaody — fanontana "B"
, avy eo matory, avy eo manonta "C"
. Aorian'izay ihany no ahafahan'ny RunLoop manatanteraka ny asa napetraka.
Valiny : BCA
Mety tsy ho tojo ireny olana ireny ianao amin'ny dinidinika, fa ny fahatakaranao azy ireo dia hanampy anao hahatakatra tsara kokoa ny GCD.
Ny kilasy Counter eto dia ampiasaina fotsiny ho an'ny semantika reference:
final class Counter { var count = 0 }
Asa 14
let counter = Counter() DispatchQueue.global().async { DispatchQueue.main.async { print(counter.count) } for _ in (0..<100) { // 1 counter.count += 1 } }
Eto, ny isa eo anelanelan'ny 0 sy 100 dia azo atao pirinty, miankina amin'ny fahasahiranan'ny kofehy lehibe. Araka ny fantatsika dia tsy afaka maminavina marina isika hoe rahoviana no hahazo loharanon-karena ny asa asynchronous—mety hitranga alohan'ny, mandritra, na aorian'ny fihodinana amin'ny kofehy mpiasa izany.
Valiny : 0-100
Asa 15
DispatchQueue.global(qos: .userInitiated).async { print(“A”) } DispatchQueue.global(qos: .userInteractive).async { print(“B”) }
Tsy manome antoka ny QoS fa hahazo loharano haingana kokoa ny filaharana manana laharam-pahamehana ambony, na dia hiezaka hanao izany aza ny iOS. Amin'ny fampiharana, ny vokatra eto dia (AB).
Valiny : (AB)
Asa 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”) }
Satria tsy fantatsika hoe iza no manomboka voalohany, na dia amin'ny asa 1000 aza dia tsy afaka mamaritra izay asa ho vita haingana kokoa.
Valiny : (AB)
Asa 16.2
Inona no vokatra raha toa ka manomboka manatanteraka miaraka ny asa?
Koa satria ny filaharana .userInteractive dia omena loharanon-karena bebe kokoa, mandritra ny asa 1000 dia hifarana haingana kokoa ny fanatanterahana an'io filaharana io.
Valiny : BA
Asa 17
Amin'ny fampiasana fomba mitovy amin'izany, afaka manova ny asa rehetra miaraka amin'ny fisalasalana avy amin'ny fizarana teo aloha isika (ohatra, Asa 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 } }
Ny isa rehetra eo anelanelan'ny 0 sy 100 dia azo atao pirinty. Ny hoe 0 azo atao pirinty dia manamafy fa ao amin'ny Task 12 dia tsy afaka manome antoka isika fa ny fivoahan'ny "C"
dia hitranga alohan'ny "B"
foana, satria tsy misy zavatra niova - fa ny tadivavarana dia somary mavesa-danja kokoa noho ny printy (mariho fa ny fanombohana fotsiny ny tadivavarana, na dia talohan'ny famonoana azy aza, dia niteraka tsy fahatokisana tanteraka).
Valiny : 0-100
Asa 18
DispatchQueue.global(qos: .userInitiated).async { print(“A”) } print(“B”) DispatchQueue.global(qos: .userInteractive).async { print(“C”) }
Misy toe-javatra mitovy amin'izany mitranga eto. Amin'ny teoria, print("A")
dia mety ho vita haingana kokoa noho print("B")
(raha solonao zavatra mavesatra kokoa print("B")
). Amin'ny fampiharana, "B"
foana no manonta voalohany. Na izany aza, ny zava-misy fa manao print("B")
alohan'ny enqueuing print("C")
mampitombo be ny mety ho "A"
ho pirinty alohan'ny "C"
, satria ny fotoana fanampiny lany amin'ny print("B")
eo amin'ny kofehy lehibe dia matetika ampy ho an'ny .userInitiated filaharana mba hahazoana loharanon-karena sy hanao print("A")
. Na izany aza, tsy azo antoka izany ary indraindray "C"
dia mety hanonta haingana kokoa. Noho izany, ao amin'ny teoria dia misy ny tsy fahatokisana tanteraka; amin'ny fampiharana dia mirona ho B(CA).
Valiny : (BCA)
Asa 19
DispatchQueue.global().sync { print(Thread.current) }
Ny antontan-taratasy momba ny sync dia milaza hoe:
"Amin'ny maha-fanatsarana ny fampisehoana, ity fiasa ity dia manatanteraka sakana amin'ny kofehy amin'izao fotoana izao raha azo atao, miaraka amin'ny singa iray: ny sakana apetraka amin'ny filaharana fandefasana lehibe dia mandeha hatrany amin'ny kofehy lehibe."
Midika izany fa ho an'ny tanjona optimization, ny antso synchronous dia mety ho tanterahana amin'ny kofehy mitovy amin'ny niantsoana azy ireo (afa-tsy ny main.sync
- ny asa mampiasa azy io dia tanterahina amin'ny kofehy lehibe). Noho izany, ny kofehy ankehitriny (mainty) dia atao pirinty.
Valiny : kofehy lehibe
Asa 20
DispatchQueue.global().sync { // 1 print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) }
"A"
ihany no atao pirinty satria misy fiatoana mitranga. Noho ny fanatsarana, ny asa (voasoratra 1) dia manomboka manatanteraka amin'ny kofehy lehibe, ary avy eo ny fiantsoana main.sync
dia mitarika ho amin'ny fiatoana.
Valiny : А, fahatapahana
Asa 21
DispatchQueue.main.async { print("A") DispatchQueue.global().sync { print("B") } print("C") }
Ny fanamafisam-peo dia mahatonga ny asa print("B")
tsy ho tafiditra ao anatin'ny filaharana fa "ampifandraisina" amin'ny kofehy famonoana ankehitriny. Noho izany, ny code:
DispatchQueue.global().sync { print("B") }
lasa mitovy amin'ny:
print(“B”)
Valiny : ABC
Avy amin'ireo asa ireo, mazava ho azy fa tsy maintsy mampiasa main.sync tsara ianao—rehefa azonao antoka fa tsy avy amin'ny kofehy lehibe ilay antso.
Ao amin'ity lahatsoratra ity, nifantoka tamin'ny foto-kevitra fototra momba ny multithreading ao amin'ny iOS isika — kofehy, asa ary filaharana — ary ny fifandraisany. Nandinika ny fomba hitantanan'ny GCD ny fanatanterahana asa manerana ny filaharana lehibe, manerantany, ary mahazatra izahay, ary niresaka momba ny fahasamihafana misy eo amin'ny famonoana serial sy miaraka. Fanampin'izany, nodinihinay ny fanavahana lehibe eo amin'ny fandefasana asa synchronous (sync) sy asynchronous (async), ary manasongadina ny fiantraikan'ireo fomba ireo amin'ny baiko sy ny fotoana famonoana ny code. Ny fifehezana ireo foto-kevitra fototra ireo dia tena ilaina amin'ny fananganana fampiharana mandray andraikitra sy maharitra ary hisorohana ny fandrika mahazatra toy ny fahatapahan-jiro.
Manantena aho fa nahita zavatra mahasoa ianao ato amin'ity lahatsoratra ity. Raha misy zavatra mbola tsy mazava dia aza misalasala mifandray amiko mba hahazoana fanazavana maimaim-poana ao amin'ny Telegram: @kfamyn .
sync
- https://developer.apple.com/documentation/dispatch/dispatchqueue/sync(execute:)-3segw