paint-brush
Gran Central Despacho, Huk kutillapaq by@kfamyn
1,011 ñawinchasqakuna
1,011 ñawinchasqakuna

Gran Central Despacho, Huk kutillapaq

by Kiryl Famin20m2025/02/28
Read on Terminal Reader

Nishu unay; Ñawinchanapaq

Kay qillqa Swift kaqpa Grand Central Dispatch (GCD) kaqninta t'aqakun, q'ipikuna, filakuna chaymanta código bloquekuna sut'inchaspa, sincronización vs.
featured image - Gran Central Despacho, Huk kutillapaq
Kiryl Famin HackerNoon profile picture
0-item
1-item

Allinllachu! Sutiyqa Kiryl Famin, iOS ruwaq kani.


Kay qillqasqapiqa huk kutillapaqmi Grand Central Dispatch (GCD) nisqamanta rimasunchik. GCD kunan Swift Modern Concurrency kaptin mawk'a hina rikch'akunman chaypas, kay marco llamk'achiq código achka watakuna rikhurinqapuni —ruraypipas chaymanta entrevistakunapipas.


Kunanqa GCD nisqamanta fundamental hamutayllapim rimarisunchik. Askha q'aytumanta llalliq aspectokunallata sut'imanta qhawasunchik, chaymanta filakuna q'ipikunapura tinkiynin —huk tema achka wak qillqakuna mana qhawayta munanku. Kay hamut'aykunata yuyaypi hap'ispa, aswan facil kanqa qampaq DispatchGroup , DispatchBarrier , semaphore, mutex, chaymanta wakhina temakuna hamut'anaykipaq.


Kay qillqasqaqa allinmi kanqa qallariqkunapaqpas, yachaysapa kamaqkunapaqpas. Tukuy imata sut’i simipi sut’inchanaypaq kallpachakusaq, mana técnico nisqa términokuna nishuta cargakuspa.

Contenido nisqamanta qhawariy

  • Sapsi yuyaykuna: q'aytu, achka q'aytu, GCD, llamk'ay, fila
  • Filakunapa layakuna: hatun, tukuypaq, sapanchasqa
  • Filapi ñawpaqman churaykuna: Calidad de Servicio (QoS) .
  • Fila serial y concurrente nisqakuna
  • Llamkanakuna ruwanapaq ñankuna: async, sincronización
  • Deadlock nisqa
  • GCD nisqa ejerciciokuna
  • T'inkikuna

Sapsi yuyaykuna: Q'aytu, Achka q'aytu, GCD, Llamkana, Fila ima

Q'aytu – aswanta, huk waqaychana maypi huk huñu sistema kamachiykuna churasqa chaymanta ruwasqa. Chiqamanta, llapa ruwanapaq codigo wakin q'ipipi purin. Hatun q'aytumanta, llamk'aq q'aytumanta t'aqayku.

Huk ruwanapi q'aytukuna


Multithreading – huk llamk'anap achka q'ipikunata huk kutillapi (huk pachallapi) ruwayta atiynin. Kayqa achka k'allmakuna codigo paralelo nisqapi purinanpaqmi saqin.


Grand Central Dispatch (GCD) – huk marco mayqinchus q'aytukunawan llamk'ayta yanapan (achka q'ipikunap allinninkunata aprovechaspa). Hatun primitivonkunaqa ruwanakuna, filakuna ima.


Chayhina, GCD huk yanapakuymi, chaymi mana sasachu qillqanapaq codigo, chaymi kuskalla ruwan. Huk sanu rikch'ana llasa yupaykunata sapaq q'ipiman uraykachiy kachkan chaymanta mana hatun q'ipipi UI musuqyachiykunata hark'anapaq.


Llamkana – huk huñusqa kamachiykunata ruwaqpa huñusqan. Importantemi entiendenapaq, ruwaqmi tantean mayqin codigo huk ruwanaman pertenecen.

Kay hina:


 print(“GCD”) // a task


 let database = Database() let person = Person(age: 23) // also a task database.store(person)


Fila – GCD kaqpa fundamental primitivo kaqnin, maypi paqarichiqqa ruwanakunata churan ruwanapaq. Filaqa ruwanakunata q'ipikunapura rakiymanta ruwayta hapin (sapa fila llamkanamanta q'ipi quchaman yaykuyniyuq).


Aswanta, filakuna saqisunkichik codigoyki ruwanakunaman organizaypi umalliyta aswan chiqamanta q'ipikuna kamachiymanta. Huk llamk'ayta huk filaman kachaptiyki, huk tarikuq q'ipipi ruwasqa kanqa — sapa kuti hukhina llamk'ayta kachanapaq llamk'achisqamanta.


Suyaypi


Llapan GIFkunap mp4 kaqninkunata tarinki kaypi otaq uraypi “T’inkikuna“ t’aqapi.

Filakunapa layakuna

  1. Hatun fila – hatun q'ipillapi ruraq fila. Serialmi (aswan chaymanta aswan qhipaman).

     let mainQueue = DispatchQueue.main


  2. Tukuy pacha filakuna – 5 filakuna kanku (huk sapa ñawpaq ruway patapaq) sistema qusqa. Paykunaqa kuskallanmi kanku.

     let globalQueue = DispatchQueue.global()


  3. Sapanchasqa filakuna – ruwaqpa ruwasqan filakuna. Ruraq huk 5 ñawpaq ruwaykunamanta akllan chaymanta laya: serie utaq concurrente (ñawpaqmanta, serie kanku).

     let userQueue = DispatchQueue(label: “com.kirylfamin.concurrent”, attributes: .concurrent).

Filapi ñawpaqman churaykuna

Calidad de Servicio (QoS) – huk sistema filapi ñawpaqman churanapaq. Maypichus huk ruwana filasqa kachkan chay filapa aswan hatun ñawpaqman churasqa kaptin, aswan recursokuna chayman rakisqa kanku. Llapanpiqa 5 QoS nisqa patakunam kan:


  1. .userInteractive – aswan hatun ñawpaqman churasqa. Chayqa llamk'achisqa llamkanakunapaq mayqinkunachus chaylla ruwayta munanku ichataq mana hatun q'ipipi purichinapaq allinchu. Ejemplopaq, huk app kaqpi mayqinchus chiqa pacha siq'i retoque ruwayta saqin, retoque ruwasqa chaylla yupasqa kanan tiyan; ichaqa, sichus hatun q'ipi ruwasqa, UI musuqyachiykunata chaymanta gestokuna llamk'achiyta hark'anman mayqinkunachus sapa kuti hatun q'ipipi ruwakunku (kayhina, mayk'aq ruwaq dedonta retoque ruwanapaq kiti patapi llimp'in, chaymanta app chaylla ruwayta rikuchinan tiyan “dedo urapi”). Chayhinam, atisqanchikman hina chay ruwasqanchikta tarinchik mana hatun q'aytuta llasachispa.


  2. .userInitiated – huk ñawpaq ruway ruwanakunapaq mayqinkunachus utqaylla kutichiyta munanku, ichaqa mana interactivo ruwanakuna hina ancha chaniyuqchu. Sapanchasqa ruwanakunapaq llamk'achkan maypi llamk'achiq entienden ruwana mana chaylla tukukunanta chaymanta suyanan tiyan (kayhina, huk sirwiq mañakuy).


  3. .default – chay standard prioridad nisqa. Asignasqa sichus ruwaq mana huk QoS nisqa willanchu huk fila ruwachkaspa – mayk'aq mana ruwanapaq sapanchasqa mañakuykuna kanchu chaymanta ñawpaq kaynin mana contextomanta tariyta atikunmanchu (kayhina, sichus huk ruwayta huk filamanta waqyanki huk .userInitiated ñawpaqchaywan, ruwana chay ñawpaqchayta herenciata chaskikun).


  4. .utility – huk ñawpaq ruway ruwanakuna mana chaylla ruwaqpa yuyayninta mañankuchu ichaqa app llamk'ayninpaq necesario kanku. Ejemplopaq, willayta huk sirwiqwan tinkiynin utaq huk autowaqaychayta discoman qillqay.


  5. .background – aswan pisi ñawpaqman churasqa. Huk ejemplon caché pichay.


Llapan filakunam Serial Filakuna icha Concurrente Filakuna hina rakisqa kanku


  • Serial filakuna – suti nisqanmanhina, kaykunaqa filakuna kanku maypi ruwanakuna hukmanta hukmanta ruwanku. Kayqa niyta munan qatiq llamk'ayqa kunan kaq tukukuptinlla qallarikun .


  • Hukllachasqa filakuna – Kay filakuna ruwanakuna paralelopi ruwayta saqin – musuq llamkana qallarikun recursokuna rakisqa kaptinku, ñawpaq ruwanakuna tukusqa kaptinpas. Reparay qallariy kamachiylla garantizasqa (huk llamkana ñawpaq filapi churasqa manaraq qhipa kaqmanta qallarinqa ), ichaqa tukukuy kamachiyqa mana garantizasqachu.

    Fila serial y concurrente nisqakuna


Imaynatataq ruranakunata rurana

Importantemi kayta yachana kunan rimachkayku ruwanakuna ruway ñankunamanta waqyaq q'ipiwan tupachisqa . Huk rimaypiqa, imayna huk llamk'ayta waqyasqaykiqa, imayna ruwanakuna ruwayta huk filaman kachasqayki q'ipipi mast'arikun chayta kamachin.

Assinkronizasqa ( async ) .

Asíncrono waqyayqa maypi waqyaq q'ipi mana hark'asqachu — chaymi, mana suyanchu llamk'ayta filapi churan ruwananpaq.

 DispatchQueue.main.async { print(“A”) } print(“B”)


Kay rikch'anapi, ruwanata hatun q'ipimanta hatun filapi print("A") (kay codigo mana mayqin sapanchasqa fila ukhupi kasqanrayku, hatun q'ipipi ñawpaqmanta ruwasqa). Chayhina, mana hatun q'ipipi ruwayta suyaykuchu chaymanta chaylla ruwayta qatiyku. Kay particular ejemplopi, print("A") ruwana hatun filapi filasqa kachkan chaymanta print("B") chaylla hatun q'ipipi ruwasqa . Imaraykuchus hatun q'ipi kunan codigo ruwaypi llamk'achkan (hinallataq hatun filamanta ruwanakuna hatun q'ipillapi ruwayta atinku), kunan llamk'ana print("B") ñawpaqta tukun, chaymanta hatun q'ipi kacharisqa kaptinlla hatun filapi filasqa llamk'ana print("A") purin. Lluqsiyninqa kaymi: BA.


 DispatchQueue.global().async { updateData() DispatchQueue.main.async { updateInterface() } Logger.log(.success) } indicateLoading()


  1. Mana sincrónicamente huk ruwayta yapayku tukuypaq filaman ñawpaqmanta ñawpaq kaywan hatun q'ipimanta — chayrayku waqyaq q'ipi chaylla hinalla purin chaymanta waqyan indicateLoading() .


  2. Huk pachamanta, llamkana llamkanapaq yanapakuykunata rakin chaymanta q'ipi quchamanta mana qullqiyuq llamk'aq q'ipipi ruwan, chaymanta updateData() waqyasqa.


  3. updateInterface() kaqwan ruwanaqa hatun filaman mana sincróno kaqpi churasqa kachkan—wayaq llamk'aq q'ipi mana tukukuyninta suyanchu chaymanta purichkan.


  4. Llamkanakuna mana sincronizado filapi churasqa kasqankuraykum, manam seguro kayta atiykuchu haykapi recursokuna rakisqa kananta. Kayhina kaqpi, mana chiqamanta niyta atiykuchu sichus updateInterface() (hatun q'ipipi) utaq Logger.log(.success) (huk llamk'aq q'ipipi) ñawpaqta ruwanqa (nitaq atiykuchu 1-2 llamkanakunapi: mayqinchus ñawpaqta ruwan, indicateLoading() hatun q'ipipi utaq updateData() llamk'aq q'ipipi). Hatun q'ipi UI musuqyachiykunata, makiwan ruway ruwayta chaymanta wak urapi ruwanakunata llamk'achkan chaypas, chaywanpas sapa kuti aswan sistema yanapakuykunata chaskikun. Hukninpiqa, llamk'aq q'ipipi ruwanapaq yanapakuykuna yaqa chaylla rakisqa kanman.



Llamada asincrónica nisqa


Reparay kay kawsachiypi huk tukuypaq fila llamk'ayninta wakin mana qullqiyuq llamk'aq q'ipipi ruwan

Sinkronizasqa ( sync ) .

Sincrónico waqyayqa maypi waqyaq q'ipi sayan chaymanta huk filapi filapi churasqa llamk'ayta tukunanpaq suyan.

 let userQueue = DispatchQueue(label: "com.kirylfamin.serial") DispatchQueue.global().async { var account = BankAccount() userQueue.sync { account.balance += 10 } let balance = account.balance print(balance) }


Kaypi, huk llamk'aq q'ipimanta huk ruwayta tukuypaq filapi ruwaqmanta, huk ruwayta huk sapanchasqa filapi sincronicamente filayku, balanzata yapanapaq. Kunan q'ipiqa hark'asqam, filapi churasqa llamk'ana tukunanta suyan. Chayhina, saldoqa imprimikun sapanchasqa filapi ruwana yapayta tukuptinlla.



Sincrónico nisqa llamkay


Qhaway: Hawa kawsachiypi, huk sapanchasqa fila llamk'ayninta wakin mana qullqiyuq llamk'aq q'ipipi ruwan

Deadlock nisqa

Sincrónico ruwanakuna contextopi, ancha allinmi mana puriy atiymanta rimay —mayk'aq huk q'aytu utaq q'aytukuna wiñaypaq suyanku paykuna kikinkuta utaq paykunapura purinankupaq. Aswan riqsisqa rikch'anaqa DispatchQueue.main.sync {} waqyaymi hatun q'ipimanta .


Hatun q'ipiqa kunan ruwayta ruwaypi llamk'achkan, chay ukhupi wakin codigo sincrónicamente ruwayta munanchik. Chayhina, sinkrunu waqyayqa hatun q'aytuta hark'an . Llamkana hatun filapi filasqa kachkan ichataq manam qallariyta atinchu imaraykuchus hatun q'ipi harkasqa kachkan kunan llamk'ana tukunanta suyaspa —hinallataq hatun filapi ruwanakuna hatun q'ipillapi puriyta atinku . Kayqa qallariypi sasa qhawaypaq kanman, ichaqa llaveqa DispatchQueue.main.sync kaqwan filasqa ruwana kunan ruwanamanta hukninman tukun, chaymanta kunan ruwanamanta qhipaman filapi churachkayku. Chayrayku, q'ipiqa kunan llamk'anap huk rakinta suyan, mana qallariyta atiq, q'ipi kunan llamk'aywan hap'isqa kasqanrayku.


 func printing() { print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) } 

Deadlock nisqa


Reparay hatun filamanta print("B") mana ruwayta atinchu hatun q'ipi hark'asqa kasqanrayku.

GCD Ejercicios nisqakuna

Kay t'aqapi, kunankama llapa yachay tarisqawan, hukniray complejidadniyuq ejerciciokunamanta rimasunchik: sasan bloques de código nisqamanta entrevistakunapi tupasqaykimanta ñawpaqman puriq sasachakuykunaman, chaykunam tanqan hamut'ayniyki programacion concurrente nisqamanta. Tukuy kay ruwaykunapi tapukuyqa kaymi: ¿Imataq consolaman imprimikunqa?


Yuyariy hatun filaqa serie kasqanmanta, global() filakuna kuskalla kasqanmanta, wakin kutitaq sasachakuyqa sapanchasqa filakuna sapanchasqa atributokunawan kanman.

Ejercicios básicos nisqakuna

Normal sasachakuyniyuq ruwaykunawan qallarisunchik – pisi chansayuq mana seguridadniyuq lluqsiypi. Kay ruwaykunan aswanta rikukun entrevistakunapi; aswan allinqa tiempoykita hap’ispa allinta t’aqwiymi chay sasachakuymanta.

Tukuy ejerciciokunamanta hunt'asqa código nisqatam kaypi tarinki .


Llamkana 1

 print(“A”) DispatchQueue.main.async { print(“B”) } print(“C”)


  1. Hatun q'ipipiqa, print("A") nisqatam rurakun.
  2. print("B") llamk'ayqa hatun filapi mana sinkrónicamente churasqa kachkan. Hatun q'ipi llamk'achisqa kasqanrayku, kay llamk'ayqa filapi suyan.
  3. Hatun q'ipipiqa, print("C") nisqatam rurakun.
  4. Hatun q'ipi mana qullqiyuq kaptin (ñawpaq llamk'ay tukusqa kaptin, huk ruwaykuna kanman hatun q'ipipi ruwayta necesitaqkuna —mana hatun filamanta ruwanakunallachu kayhina UI musuqyachiykuna, makiwan ruway, hukkunapas. Aswan ukhu hamut'anapaq, ama hina kaspa aswanta ñawiriy RunLoop kaqmanta ) filachasqa llamkana print("B") ruwasqa.


Kutichiy : ACB


Llamkana 2

 print(“A”) DispatchQueue.main.async { print(“B”) } DispatchQueue.main.async { print(“C”) } print(“D”)


  1. Hatun q'ipipiqa, print("A") nisqatam rurakun.
  2. print("B") llamk'ayqa hatun filapi filachasqa kachkan. Hatun fila hatun q'ipi tarikunankama.
  3. print("C") ruwanaqa print("B") nisqamanta qhipaman filasqa kachkan chaymanta suyallantaq.
  4. Hatun q'ipiqa ruwayta hinallam purin, "D" nisqatam qillqan.
  5. Hatun q'ipi tarikuptin (huk RunLoop ruwanakunata llamk'achisqamanta), ñawpaq filapi llamk'ay— print("B") —rurakun.
  6. Hatun q'ipi wakmanta kacharisqa kaptin (huk RunLoop ruwanakunata ruwasqamanta —hamuq pachapi, kay detalleta saqisaq imaraykuchus mana tukuy kamachiyta afectanchu), llamk'ana print("C") ruwasqa.


Kutichiy : ADBC


Chaylla rimanay wakin ejemplokunapi, sut'inchayta huk chhikanta pisiyachisaq chaymanta sistema llamadas sincrónicas ruwayta allinchasqanmanta saqisaq, chaymanta qhipaman rimasunchik.


Llamkana 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”) }


  1. print("A") nisqa hatun q'ipipi rurasqa.
  2. Huk mana sinkruno llamk'ana (1–3 sutiyuq) hatun filapi filachasqa kachkan mana kunan (hatun) q'ipi hark'aspa.
  3. Hatun q'ipiqa ruwayta hinallam purin, "F" qillqan.
  4. print("G") llamk'ayqa ñawpaq ruwaymanta qhipaman hatun filapi filasqa kachkan (1–3 llamkanakuna).
  5. Huk kuti hatun q'ipi kacharisqa kaptin, ñawpaq filapi llamk'ay— print("B") —rurayta qallarikun.
  6. Chaymanta print("C") llamk'ayqa hatun filapi filasqa kachkan (maypichus kunan ruwana ruwakuchkanraq, chaymanta print("G") filapi qatin). Asíncrono yapasqa kasqanrayku, mana hunt'akuyninta suyaykuchu, chaymanta chaylla ñawpaqman puriyku.
  7. Chaymanta, print("D") llamk'ayqa tukuypaq filapi filasqa kachkan. Kay waqyay sincrono kasqanrayku, tukuypaq fila ruwanankama suyayku (mayqin llamk'aq q'ipi kaqpipas purinman) manaraq purichkaspa.
  8. Tukuyninpiqa, print("E") llamk'ayqa hatun filapi filachasqa kachkan. Kay waqyayqa sinkruno kasqanrayku, kunan q'ipiqa llamk'ana tukunankama hark'asqa kanan tiyan. Ichaqa, hatun filapi ruwanakunañam kachkan, chaymanta print("E") llamk'ayqa tukukuyman yapasqa, chaymanta. Chayrayku, chay llamkanakuna ñawpaqta ruwanan tiyan manaraq print("E") purichiyta atichkaptin. Ichaqa hatun q'ipiqa kunan llamk'ayta ruwaypi llamk'achkanraq, chayrayku mana qatiq filapi llamk'aykunaman riyta atinchu. Kunan llamk'aymanta qhipaman "G" chaymanta "C" impriminapaq mana llamk'anakuna kaptinpas, q'ipiqa manaraqmi puririyta atirqanchu, kunan llamk'ay (1–3 llamk'aykuna) manaraq tukusqanrayku.
  • Sichus waqyay mana sinkronochu karqan, imprimiy("E") llamk'ayqa "G" chaymanta "C" impriminapaq llamk'anakuna qhipaman filasqalla kanman.


Kutichiy : AFBD

Huk kutichiy (sichus iskay kaq waqyay async karqan ): AFBDGCE


Llamkana 4

 let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”) serialQueue.async { // 1 print(“A”) serialQueue.sync { print(“B”) } print(“C”) } // 2

  1. Huk ruwana (1–2 llamkanakuna) huk sapanchasqa serie fila kaqpi mana sincróno kaqpi churasqa kachkan (ñawpaqmanta, filakuna serie kanku mana .concurrent atributota llamk'achisqaykumanta).

  2. Llamkana yanapakuykunata rakiptinqa, ruway qallarikun chaymanta "A" qillqasqa.
  3. Kikin serie fila ukhupi, huk sincrono llamkana print("B") filasqa kachkan. Llamayqa sincrono kasqanraykum, q'ipiqa ruwakuyninta suyaspa harkan.
  4. Ichaqa, fila serial kasqanrayku, hawa llamk'aywan 1-2 llamk'achisqaraq kasqanrayku, print("B") llamk'ayqa mana qallariyta atinchu, chayraykutaq huk mana puriy atiymi.


Kutichiy : A, mana puriy atiq

Kay rikch'ana rikuchin mayqin serie filapipas mana puriy atiy ruwayta atinman —hatun fila kaqpipas utaq sapanchasqa fila kaqpipas.


Llamkana 5

Ñawpaq ruwanamanta serie filata huk kuskalla kaqwan tikrasun.

 DispatchQueue.global().async { // 1 print("A") DispatchQueue.global().sync { print("B") } print("C") } // 2


  1. Huk llamkana (1–2 llamkanakuna) tukuy pacha (kuklla) filapi mana sincróno nisqapi churasqa kachkan.
  2. Recursokuna rakisqa kaptin, ruway qallarikun hinaspa "A" imprimikun.
  3. Huk sinkruno waqyay print("B") ruwanapaq kikin tukuypaq filapi ruwasqa, mayqinchus kunan llamk'aq q'ipi llamk'ay tukunankama hark'an.
  4. Kayhina kaqpi, q'ipi hark'asqa kaptinpas, tukuypaq fila kaqlla kasqanrayku, qatiq llamk'ayta ruwayta qallariyta atin mana kunan kaq tukunanta suyaspa —huk q'ipipi purichispalla. Chayhina, waqyaq q'ipiqa print("B") llamk'ayta huk llamk'aq q'ipipi rurasqa kananta suyan.
  5. Llamkana tukusqa kaptin, qallariy waqyay q'ipi mana hark'asqa, "C" qillqasqa.

Kutichiy : ABC


Llamkana 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")


  1. Hatun q'aytuqa "A" nisqatam qillqan.

  2. Huk asíncrono ruwana (1–8 llamkanakuna) hatun filapi filasqa kachkan mana kunan q'ipi harkaspa.

  3. Hatun q'aytuqa hinallam purin, "I" qillqan.

  4. Qhipaman, hatun q'ipi kacharisqa kaptin, hatun fila llamk'anaman filasqa ruwayta qallarikun, "B" -tataq qillqan.

  5. Huk asíncrono ruwana (2–5 llamkanakuna) hatun filapi filasqa kachkan – mana kunan q'ipi harkaspa.

  6. Kunan q'ipipi ruwayta qatispa, 6–7 llamk'aypa sinkruno kachayninmi tukuy pacha filaman ruwakun —kayqa kunan (hatun) q'ipitam hark'an llamk'ay tukunankama.

  7. 6–7 llamk'ayqa huk q'ipipi ruwayta qallarikun, "F" nisqa qillqaspa.

  8. print("G") llamk'ayqa tukuy pacha filaman hukllachasqa kachasqa, kunan llamk'aq q'ipi tukunankama hark'aspa.

  9. "G" nisqa qillqasqa, chaymanta llamk'aq q'aytu maymantachus kay llamk'ay kachasqa karqan, mana hark'asqa.

  10. 6–7 llamk'ayqa tukukun, maymantachus kachasqa karqan chayta kicharispa (hatun q'aytu), "H" nisqa qillqasqataq.

  11. 1–2 llamk'ay tukusqa kaptin, ruwayqa hatun filapi qatiq llamk'ayman kuyun —2–5 llamk'ay— chaymi qallarikun hinaspa "C" nisqatam imprimin.

  12. 3–4 llamk'ayqa hatun filapi filasqa kachkan mana q'aytuta hark'aspa.

  13. Kunan llamk'ay (2–5) tukukuptinqa, qatiq llamk'aypi (3–4) ruwayqa qallarikun, "D" -ta imprimispa.

  14. print("G") llamk'ayqa kuskalla hatun filamanmi kachasqa, kunan q'ipi hark'aspa.

  15. Chaymanta llamkana mana tukukuyniyuq suyan llamk'ayta print("E") hatun q'ipipi ruwananpaq—q'ipi hark'asqa kasqanrayku, kayqa huk mana puriy atiyman pusakun.


Kutichiy : AIBFGHCD, mana puriy atiy

Chawpi ejerciciokuna

Chawpi sasachakuyniyuq llamkaykunaqa mana chiqap kaqwanmi. Chayna sasachakuykunaqa entrevistakunapipas tarikunmi, ichaqa pisillapim.


7 kaq llamkay

 DispatchQueue.global().async { print("A") } DispatchQueue.global().async { print("B") }


  1. print("A") nisqaqa tukuy pacha filapi mana sinkróno nisqapi churasqa kachkan —mana kunan q'ipi hark'aspa.
  2. Suyayku sistema tukuypaq filapi ruwanapaq yanapakuykunata rakinanta. Teoría nisqapiqa, kayqa mayk'aqllapas ruwakunmanmi —manaraq qatiq kamachiyta ruwachkaspapas, print("B") nisqapi filapi churanapaq. Kay particular casopi, qatiq ruwana ñawpaqta filaman yapasqa, chaymantalla recursokuna tukuypaq filaman rakisqa kanku. Kayqa ruwakun hatun q'ipi aswan yanapakuykunata rakisqa kasqanrayku, chaymanta hatun q'ipipi qatiq llamk'ayqa ancha llasaqmi (huk llamk'ayta yapanapaq llamk'aylla), ruwaypitaq aswan utqaylla ruwakun tukuy pacha filapi yanapakuy rakiymanta. Qatiqnin rakipim rimarisunchik contranpi kaqkunamanta.
  3. print("B") nisqa tukuypaq filapi filasqa kachkan.
  4. Chaykama, hatun q'ipiqa hinallam purin, pachantinpi filaqa kapuq rakiyta suyachkaptin.
  5. Recursokuna kaptin, iskaynin llamkanakuna ruwakun. "A" llamk'ana imprimiy "B" kaqmanta ñawpaqta qallarinman chaypas, mana kamachiyta garantizayta atiykuchu imaraykuchus imprimiyqa mana atómico llamk'aychu (chay rato lluqsiy consolapi rikukun llamk'ay tukukuy qayllapi kachkan).


Kutichiy : (AB) .

Paréntesis nisqapin rikukun letrakuna ima ordenpipas rikhurimunanta: AB otaq BA nisqapipas.


8 kaq ruway

 print("A") DispatchQueue.main.async { print("B") } DispatchQueue.global().async { print("C") }

Kaypiqa, "A" nisqa ñawpaqta imprimisqa kasqanmantallam seguro kayta atichwan. Mana allintachu yachayta atiykuman sichus hatun filapi ruwana utaq tukuypaq filapi kaq aswan utqaylla ruwakunqa.


Kutichiy : A(BC) .


Llamkana 9

 DispatchQueue.global(qos: .userInteractive).async { print(“A”) } DispatchQueue.main.async { // 1 print(“B”) }


chaymanta

 DispatchQueue.global(qos: .userInteractive).async { print(“A”) } print(“B”) // 1


Hukninpiqa, iskaynintinpi print("B") nisqa hatun q'ipipi rurasqa. Hinallataq, mana allintachu yachayta atiyku mayk'aqchus tukuypaq filaman recursokuna rakikunqa, chayrayku teóricamente, "A" chaylla imprimisqa kanman manaraq hatun q'ipipi // 1 marcasqa puntoman chayachkaspa. Ichaqa ruwaypiqa ñawpaq kaq ruwayqa AB nisqawanmi imprimikun, iskay kaqtaq BA nisqawanmi imprimikun. Kayqa ñawpaq kaqpi, print("B") hatun q'ipimanta qatiq RunLoop kutichiypi (utaq pisi kutichiykuna qhipaman) ruwasqa kasqanrayku, iskay kaqpitaq, print("B") kunan RunLoop kutichiypi hatun q'ipipi purinanpaq programasqa kachkan. Ichaqa manan garantizayta atiykuchu chay ordenta.


Iskaynin llamkaypaq kutichiy : (AB) .


10 kaq llamkay

 print("A") DispatchQueue.global().async { print("B") DispatchQueue.global().async { print("C") } print("D") }

Sut'inmi lluqsiypa qallariynin "AB" kasqan. print("C") nisqa filapi churasqa kaspaqa, manam allintachu yachayta atiyku mayk'aq chaypaq yanapakuykuna rakisqa kananta—kay llamk'ayqa manaraq print("D") nisqamanta qhipamanpas ruwayta atinmanmi. Kayqa wakin kutipiqa ruwaypipas pasakunmi.


Kutichiy : AB(CD) .


Llamkana 11

 let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”, qos: .userInteractive) DispatchQueue.main.async { print(“A”) serialQueue.async { print(“B”) } print(“C”) }

Yapamanta, mana chiqamanta yachayta atiykuchu mayk'aq recursokuna print("B") kaqpaq rakisqa kananta sapanchasqa filapi. Ruwaypiqa, hatun q'aytuman aswan ñawpaqman churasqa kasqanrayku, "C" nisqaqa "B" nisqamanta ñawpaqtaraqmi imprimin, ichataq kayqa manam garantizasqachu.


Kutichiy : A(BC) .


Llamkana 12

 DispatchQueue.global().async { print("A") } print("B") sleep(1) print("C")

Kaypi, sut'i kachkan lluqsiy BAC kanqa imaraykuchus huk segundo puñuyqa tukuy pachantinpi fila suficiente pachayuq kaqta qhawan recursokuna rakinapaq. Hatun q'ipi puñuywan hark'asqa kachkaptin (chaytaqa manam ruruchiypi ruranaykichu), print("A") huk q'ipipi ruran.


Kutichiy : BAC


Llamkana 13

 DispatchQueue.main.async { print("A") } print("B") sleep(1) print("C")

Kayhina kaptinqa, print("A") hatun filapi filasqa kasqanrayku, hatun q'ipillapim rurasqa kanman. Ichaqa, hatun q'ipiqa chiqapchayta ruraspallapunim kachkan — "B" nisqatam qillqaspa, chaymantataq puñuspa, chaymantataq "C" nisqatam qillqaspa. Chay qhipamanlla RunLoop filasqa ruwayta ruwayta atin.


Kutichiy : BCA

Ñawpaqman puriq ruwaykuna

Manachá kay sasachakuykunawan tupankichu entrevistakunapi, ichaqa chaykunata hamut’ayqa yanapasunki aswan allinta GCD hap’inaykipaq.

Kaypi Counter nisqa claseqa referencia semántica nisqallapaqmi llamk'achisqa:

 final class Counter { var count = 0 }


Llamkana 14

 let counter = Counter() DispatchQueue.global().async { DispatchQueue.main.async { print(counter.count) } for _ in (0..<100) { // 1 counter.count += 1 } }

Kaypiqa, 0manta 100kama ima yupaypas imprimisqa kanman, hatun q'aytup llamk'ayninman hina. Yachasqanchikhina, mana allintachu willayta atiyku mayk'aq asíncrono ruwana recursokunata chaskinqa —chayqa kanman ñawpaq, pacha utaq qhipa llamk'aq q'ipipi llimp'i.


Kutichiy : 0-100


Llamkana 15

 DispatchQueue.global(qos: .userInitiated).async { print(“A”) } DispatchQueue.global(qos: .userInteractive).async { print(“B”) }

QoS mana garantizanchu aswan hatun prioridadniyuq fila aswan utqaylla recursokuna chaskinanta, ichaqa iOS chayta ruwayta munanqa. Ruwaypiqa kaypi lluqsiyninqa (AB) nisqa.


Kutichiy : (AB) .


Llamkana 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”) }

Mayqin ruway ñawpaqta qallarisqanmanta mana yachayta atisqaykurayku, 1000 llamk'aykunapipas mana mayqin llamk'ay aswan utqaylla tukukunanta riqsiyta atiykuchu.


Kutichiy : (AB) .


Llamkana 16.2

¿Imataq lluqsiynin suyaspa operaciones qallarinku ejecutar simultáneamente?


.userInteractive fila aswan yanapakuykunata rakisqa kasqanrayku, 1000 llamkanakuna span kaqpi chay filapi ruwayqa sapa kuti aswan utqaylla tukunqa.


Kutichiy : BA


Llamkana 17

Chayman rikchakuq ruwaywan, ñawpaq rakimanta mana chiqap kaqwan ima ruwaytapas tikrayta atichwan (kayhina, 12 kaq llamkana):


 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 } }


0manta 100kama ima yupaypas imprimikunmanmi. 0 imprimiyta atikusqanqa, 12 kaq llamk'aypi mana garantizayta atiykuchu "C" lluqsiynin sapa kuti "B" ñawpaqpi kananta, imaynachus esencialmente mana imapas tikrasqachu —chaylla chay llimp'iqa aswan pisi recurso-intensive huk impresomanta (reparay, llalliq qallariylla, manaraq ruwasqa kachkaptinpas, ruwaypi tukuy mana seguro kaqpi tukusqa).

Kutichiy : 0-100


Llamkana 18

 DispatchQueue.global(qos: .userInitiated).async { print(“A”) } print(“B”) DispatchQueue.global(qos: .userInteractive).async { print(“C”) }


Kaypipas chayman rikchakuq situacionmi pasakun. Teoría kaqpi, print("A") aswan utqaylla ruwayta atinman print("B") kaqmanta (sichus print("B") huk pisi aswan llasa kaqwan tikranki). Ruwaypiqa "B" nisqa ñawpaqtaraqmi imprimin. Ichaqa, manaraq print("B") filapi churachkaspa print("C") ruwasqaykuqa anchata yapan "A" manaraq "C" kaqpi imprimisqa kananta, chaymanta yapasqa pacha print("B") kaqpi hatun q'ipi kaqpi sapa kuti suficiente .userInitiated filapaq recursokuna chaskinanpaq chaymanta print("A") ruwanapaq. Chaywanpas, kayqa manam garantizasqachu wakin kutitaq "C" aswan utqaylla impriminman. Chay hinaqa, teoría nisqapiqa hunt’asqa mana seguro kaymi kan; ruwaypiqa, B(CA) nisqamanmi tendenciayuq.


Kutichiy : (BCA) .


Llamkana 19

 DispatchQueue.global().sync { print(Thread.current) }


T'inkinakuypaq qillqakunaqa kayhinam:


“Huk ruway allinchay hina, kay ruwayqa kunan q'ipipi hark'akunata ruwan mayk'aq atikuqtin, huk t'aqawan: hatun kachay filaman apachisqa hark'akuna sapa kuti hatun q'ipipi purin.”

Kayqa niyta munan, allinchaypaq, sincrónico waqyaykuna kikin q'ipipi ruwayta atinku maymantachus waqyasqa karqanku ( main.sync kaqwan mana – llamk'achisqa ruwanakuna sapa kuti hatun q'ipipi ruwanku). Chayhinam kunan (principal) q'aytuqa imprimikun.


Kutichiy : hatun q'aytu


20 kaq llamkay

 DispatchQueue.global().sync { // 1 print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) }

"A" nisqallam qillqasqa kachkan, huk mana puriy atiy kasqanrayku. Allinchayrayku, ruwana (1 sutiyuq) hatun q'ipipi ruwayta qallarikun, chaymanta main.sync waqyayqa huk mana puriy atiyman pusakun.


Kutichiy : А, mana puriy atiq


Llamkana 21

 DispatchQueue.main.async { print("A") DispatchQueue.global().sync { print("B") } print("C") }


Allinchayqa print("B") ruwayta mana filasqa kananpaq ruwan ichaqa “spliced” kunan ruway q'ipiman. Chayhinam, kay codigo:

 DispatchQueue.global().sync { print("B") }


kaywan tupaqmi tukun:

 print(“B”)


Kutichiy : ABC


Kay ruwanakunamanta, sut'i kachkan main.sync ancha allinta llamk'achinayki tiyan —chaylla mayk'aqchus seguro kanki waqyay mana hatun q'ipimanta ruwasqachu.

Conclusion

Kay qillqasqapi, iOS kaqpi achka q'ipikuna ruwaypa sapsi hamut'ayninkunamanta t'uqyasqayku — q'aytukuna, ruwanakuna chaymanta filakuna— chaymanta paykunapura tinkiyninkunamanta. Imayna GCD ruwanakuna ruwayta kamachin chaymanta hatun, pachantinpi chaymanta sapanchasqa filakunapi maskarqayku, chaymanta serie chaymanta kuska ruwaypa chiqan kayninkunamanta rimarqayku. Chaymanta, sincrono (sincronizado) chaymanta asíncrono (sincrono) ruwana kachaymanta critica distincionesta qhawarqayku, imayna kay enfoques ordenta chaymanta pacha codigo ruwaymanta afectan chayta resaltaspa. Kay qallariy hamut'aykunata kamachiyqa ancha allinmi kutichiq, takyasqa ruwanakuna ruwanapaq chaymanta mana común trampas kaqmanta kayhina mana puriy atiykunamanta.


Suyachkani kay qillqasqapi imapas allin kaqta tarisqaykita. Sichus imapas mana sut’ichu kashan chayqa, ama manchakuspa rimanakuy Telegram nisqapi mana qolqellapaq sut’inchanaykipaq: @kfamyn .

Chaywan tupaq t’inkikuna

  1. YouTube canal tukuy animacionkunawan - https://www.youtube.com/@kirylfamin
  2. Ejerciciokuna hunt'asqa código - https://github.com/kfamyn/GCD-Tasks
  3. Mi Telegrama - http://t.me/kfamyn
  4. RunLoop - https://developer.apple.com/qillqakuna/fundación/runloop
  5. sync método qillqakuna - https://developer.apple.com/documentation/dispatch/dispatchqueue/sync(ruray:)-3segw