Salam! Meniň adym Kiril Famin, men bolsa iOS dörediji. Bu makalada bir gezek açarys. “Swift Modern Concurrency” -iň barlygy sebäpli GCD köne ýaly görünse-de, bu çarçuwany ulanýan kod köp ýyllap önümçilikde-de, söhbetdeşliklerde-de peýda bolar. Grand Central Dispatch (GCD) -ni Bu gün diňe GCD-iň esasy düşünjesine ünsi jemläris. Diňe köp okamagyň möhüm taraplaryny jikme-jik öwreneris, - beýleki köp makalalaryň ünsden düşürýän mowzugy. Bu düşünjeleri göz öňünde tutup, , , semafor, mutex we ş.m. ýaly mowzuklara düşünmek has aňsat bolar. nobatlaryň we sapaklaryň arasyndaky baglanyşygy DispatchGroup DispatchBarrier Bu makala täze başlanlar we tejribeli işläp düzüjiler üçin peýdaly bolar. Tehniki adalgalaryň aşa köp bolmagynyň öňüni alyp, hemme zady düşnükli dilde düşündirmäge synanyşaryn. Mazmuna syn Esasy düşünjeler: sapak, köp okamak, GCD, wezipe, nobat Nobatlaryň görnüşleri: esasy, global, adat Nobatyň ileri tutulýan ugurlary: Hyzmatyň hili (QoS) Seriýa we yzygiderli nobatlar Wezipeleri ýerine ýetirmegiň ýollary: async, sinhronlamak Gulp GCD maşklary Salgylar Esasy düşünjeler: sapak, köp okamak, GCD, wezipe we nobat - esasan, ulgam görkezmeleriniň toplumy ýerleşdirilen we ýerine ýetirilýän gap. Aslynda, ýerine ýetirip boljak kodlaryň hemmesi käbir sapaklarda işleýär. Esasy sapak bilen işçi sapaklaryny tapawutlandyrýarys. Tekst - ulgamyň birnäçe sapagy bir wagtda ýerine ýetirmek ukyby (şol bir wagtyň özünde). Bu koduň birnäçe şahasyna parallel işlemäge mümkinçilik berýär. Köp okamak - sapaklar bilen işlemegi ýeňilleşdirýän çarçuwa (köp okamagyň artykmaçlyklaryndan peýdalanmak). Onuň esasy başlangyçlary meseleler we nobatlar. “Grand Central Dispatch” (GCD) Şeýlelik bilen, GCD şol bir wagtyň özünde ýerine ýetirýän kod ýazmagy aňsatlaşdyrýan guraldyr. Simpleönekeý mysal, esasy sapakdaky UI täzelenmelerine päsgel bermezlik üçin agyr hasaplamalary aýratyn sapaga ýüklemekdir. - dörediji tarapyndan toparlanan görkezmeler toplumy. Haýsy koduň belli bir meselä degişlidigini döredijiniň çözýändigine düşünmek möhümdir. Wezipe Mysal üçin: print(“GCD”) // a task let database = Database() let person = Person(age: 23) // also a task database.store(person) - GCD-iň esasy başlangyjy, işläp düzüjiniň ýerine ýetirmek üçin wezipeleri goýýan ýeri. Nobat arasynda meseleleri paýlamak jogapkärçiligini öz üstüne alýar (her nobat ulgamyň sapak howzuna girip biler). Nobat sapaklaryň Aslynda, nobatlar sapaklary gönüden-göni dolandyrmak däl-de, kodlaryňyzy meselelere tertipleşdirmäge ünsi jemlemäge mümkinçilik berýär. Bir meseläni nobata ibereniňizde, elýeterli sapakda ýerine ýetiriler - köplenç ýumuş ibermek üçin ulanylýanlardan tapawutly. Ghli GIF-leriň mp4 wersiýalaryny tapyp bilersiňiz ýa-da aşakdaky “Salgylar” bölüminde. şu ýerde Nobatlaryň görnüşleri - diňe esasy sapakda ýerine ýetirilýän nobat. Bu serial (has soňrak). Esasy nobat let mainQueue = DispatchQueue.main Global nobatlar - ulgam tarapyndan üpjün edilýän 5 nobat (her ileri tutulýan dereje üçin bir) bar. Olar birmeňzeş. let globalQueue = DispatchQueue.global() Omörite nobatlar - dörediji tarapyndan döredilen nobatlar. Öndüriji 5 ileri tutulýan ugurdan birini we görnüşini saýlaýar: yzygiderli ýa-da yzygiderli (tertip boýunça olar seriýal). let userQueue = DispatchQueue(label: “com.kirylfamin.concurrent”, attributes: .concurrent). Ileri tutulýan ugurlar - nobatyň ileri tutulýan ulgamy. Bir meseläniň ýerine ýetirilýän nobatynyň ähmiýeti näçe ýokary bolsa, şonça-da köp serişde bölünip berilýär. Jemi 5 QoS derejesi bar: Hyzmatyň hili (QoS) - iň ýokary ähmiýet. Derrew ýerine ýetirilmegini talap edýän, ýöne esasy sapakda işlemek üçin laýyk däl meseleler üçin ulanylýar. Mysal üçin, hakyky wagtda surata düşürmäge mümkinçilik berýän programmada, retouch netijesi derrew hasaplanmalydyr; şeýle-de bolsa, esasy sapakda edilse, UI täzelenmelerine we elmydama esasy sapakda bolup geçýän hereketlere päsgel berer (mysal üçin, ulanyjy barmaly ýeriniň üstünden barmagyny süýşürende we programma derrew netijäni “barmagyň aşagynda” görkezmeli). Şeýlelik bilen, esasy sapagy ýüklemän netijäni mümkin boldugyça çalt alýarys. .userInteractive - interaktiw meseleler ýaly möhüm bolmasa-da, çalt seslenmegi talap edýän meseleler üçin ileri tutulýan ugur. Adatça, ulanyjy meseläniň bada-bat gutarmajakdygyna we garaşmaly boljakdygyna düşünýän meseleler üçin ulanylýar (mysal üçin, serwer haýyşy). .userInitiated - adaty ileri tutulýan ugur. Dörediji nobat döredilende QoS-ny kesgitlemeýän bolsa - ýumuş üçin anyk talaplar ýok bolsa we onuň ähmiýetini kontekstden kesgitläp bolmaýan bolsa (meselem, .userInitiated ileri tutulýan nobat bilen bir meseläni çagyrsaňyz, wezipe şol ileri tutulýar). .default - ulanyjylaryň derrew seslenmegini talap etmeýän, ýöne programmanyň işlemegi üçin zerur bolan meseleler üçin ileri tutulýan ugur. Mysal üçin, maglumatlary serwer bilen sinhronlamak ýa-da diska awtosawka ýazmak. .utility - iň pes ähmiýet. Mysal üçin keş keşini arassalamak. .background Quhli nobatlar ýa-da hökmünde bölünýär Serial nobatlar yzygiderli nobatlar - adyndan görnüşi ýaly, bular wezipeleriň biri-birini ýerine ýetirýän nobatlarydyr. Bu, indiki meseläniň diňe soň başlanýandygyny aňladýar. Seriýa nobatlary häzirki iş gutarandan - Bu nobatlar meseleleri paralel ýerine ýetirmäge mümkinçilik berýär - öňki meseleler gutarandygyna garamazdan çeşmeler bölünen badyna täze mesele başlaýar. Diňe başlangyç sargyt kepillendirilendigine üns beriň (ozal berlen mesele soňkusyndan öň ), ýöne gutarmagyň tertibi kepillendirilmeýär. Bilelikdäki nobatlar başlar Wezipeleri nädip ýerine ýetirmeli bilen baglanyşykly meseleleriň ýerine ýetiriş usullaryny ara alyp maslahatlaşýandygymyzy bellemelidiris. Başga sözler bilen aýdylanda, ýumuş diýmegiň usuly, meseläni nobata iberýän sapakda wakalaryň nähili bolýandygyny kesgitleýär. Çagyryş sapagy ( ) Asynkron görnüşde async Asynkron jaň, çagyryş sapagynyň petiklenmedik ýeridir, ýagny ýerine ýetirýän işine garaşmaýar. DispatchQueue.main.async { print(“A”) } print(“B”) Bu mysalda, esasy esasy meselesini birkemsiz ýerine ýetirýäris (bu kod belli bir nobatyň içinde bolmansoň, esasy sapakda ýerine ýetirilýär). Şeýlelik bilen, esasy meselä garaşmaýarys we derrew ýerine ýetirilmegini dowam etdirýäris. Bu aýratyn mysalda meselesi esasy ýazylýar we soňra esasy derrew ýerine ýetirilýär. Esasy häzirki kody ýerine ýetirmek bilen meşgullanýandygy sebäpli (we esasy nobatdaky meseleler diňe esasy sapakda ýerine ýetirilip bilner), häzirki ýumuş ilki bilen gutarýar we diňe esasy boş bolansoň, esasy meselesi işleýär. Çykyş: BA. sapakdan nobata print("A") sapakdaky print("A") nobata print("B") sapakda sapak print("B") sapak nobat print("A") DispatchQueue.global().async { updateData() DispatchQueue.main.async { updateInterface() } Logger.log(.success) } indicateLoading() Biz esasy sapakdan deslapky ähmiýeti bilen global nobata birkemsiz goşýarys - şonuň üçin jaň sapagy derrew dowam edýär we . indicateLoading() Birneme wagt geçensoň, ulgam ýumuş üçin çeşmeler bölýär we sapak basseýninden mugt işçi sapagynda ýerine ýetirýär we diýilýär. updateData() öz içine alýan mesele esasy nobata asynkron görnüşde berilýär - jaň edýän işçi sapagy gutarmagyna garaşmaýar we dowam edýär. updateInterface() Işler birkemsiz ýerine ýetirilendigi sebäpli, çeşmeleriň haçan bölünjekdigini anyk bilip bilmeris. Bu ýagdaýda, (esasy sapakda) ýa-da (işçi sapagynda) ilki ýerine ýetiriljekdigini anyk aýdyp bilmeris (1-2-nji ädimde edip bilmeris: ilki ýerine ýetirýän, esasy sapakda ýa-da işçi sapagyndaData ). Esasy sapak UI täzelenmeleri, jestleri gaýtadan işlemek we beýleki esasy meseleler bilen meşgul bolsa-da, elmydama iň ýokary ulgam çeşmelerini alýar. Beýleki tarapdan, işçi sapagynda ýerine ýetirmek üçin çeşmeler derrew diýen ýaly bölünip bilner. updateInterface() Logger.log(.success) indicateLoading() updateData() Bu animasiýada global nobatyň käbir mugt işçi sapaklarynda öz wezipelerini ýerine ýetirýändigini ýadyňyzdan çykarmaň ( ) Sinhron sync Sinhron jaň, çagyryş sapagynyň durup, nobatda ýerine ýetirilen işine garaşýan ýeridir. let userQueue = DispatchQueue(label: "com.kirylfamin.serial") DispatchQueue.global().async { var account = BankAccount() userQueue.sync { account.balance += 10 } let balance = account.balance print(balance) } Bu ýerde, global nobatda bir meseläni ýerine ýetirýän sapagyndan, deňagramlylygy ýokarlandyrmak üçin adaty nobatda bir meseläni sinhronlaşdyrýarys. Häzirki sapak petiklenýär we berlen işiň gutarmagyna garaşýar. Şeýlelik bilen, balans diňe adaty nobatdaky wezipe artdyrylandan soň çap edilýär. işçi Bellik: aboveokardaky animasiýada adaty nobat käbir mugt işçi sapaklarynda öz wezipelerini ýerine ýetirýär Gulp Sinhron meseleleriň çäginde, sapak ýa-da sapaklar özleri ýa-da biri-biriniň dowam etmegi üçin belli bir wagt garaşmasa, petiklemäni ara alyp maslahatlaşmak möhümdir. Iň ýaýran mysal, esasy DispatchQueue.main.sync {calling diýmekdir. sapakdan Esasy , käbir kodlary sinhron ýerine ýetirmek isleýän häzirki meseläni ýerine ýetirmek bilen meşgullanýar. Şeýlelik bilen, sinhron jaň esasy bloklaýar. Esasy ýerine ýetirilýär, ýöne başlap bilmeýär, sebäbi häzirki işiň gutarmagyna garaşýan esasy petiklenýär we esasy meseleler diňe esasy bolup biler. Ilki bilen göz öňüne getirmek kyn bolup biler, ýöne esasy zat bilen berlen meseläniň häzirki meseläniň bir bölegine öwrülýändigine düşünmek we häzirki işden soň nobata durýarys. Netijede, sapak häzirki ýumuş bilen meşgullanýanlygy sebäpli, başlap bolmajak bir bölegine garaşýar. sapak sapagy ýumuş sapak nobatdaky sapakda DispatchQueue.main.sync func printing() { print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) } ýerine ýetirip bilmejekdigine sebäbi esasy sapak petiklenendir. Esasy nobatdaky print("B") üns beriň, GCD maşklary Bu bölümde şu wagta çenli alnan ähli bilimler bilen dürli çylşyrymly maşklary ara alyp maslahatlaşarys: söhbetdeşliklerde duşjak ýönekeý kod bloklaryndan başlap, şol bir wagtyň özünde programmirlemäge düşünmegiňizi güýçlendirýän öňdebaryjy kynçylyklara çenli. Bu meseleleriň hemmesinde sorag: Konsolda näme çap ediler? Esasy nobatyň yzygiderli, global () nobatlaryň birmeňzeşdigini ýadyňyzdan çykarmaň, käwagt mesele belli bir atributlary bolan adaty nobatlary öz içine alyp biler. Esasy maşklar Adaty kynçylyklardan - çykyşda näbellilik mümkinçiligi az bolanlardan başlarys. Bu meseleler, söhbetdeşliklerde ýüze çykmagy ähtimal; esasy zat wagtyňyzy almak we meseläni üns bilen seljermekdir. Exerciseshli maşklaryň doly koduny tapyp bilersiňiz. şu ýerden 1-nji wezipe print(“A”) DispatchQueue.main.async { print(“B”) } print(“C”) Esasy sapakda ýerine ýetirilýär. print("A") esasy nobata asynkron görnüşde berilýär. Esasy sapak meşgul bolansoň, bu mesele nobata garaşýar. print("B") Esasy sapakda ýerine ýetirilýär. print("C") Esasy sapak mugt bolanda (öňki ýumuş gutarandan soň, diňe UI täzelenmeleri, jest bilen işlemek we ş.m. ýaly esasy nobatdaky meseleler däl-de, esasy sapakda gaýtadan işlenmeli beýleki wakalar bolup biler. Has çuňňur düşünmek üçin, ” hakda has giňişleýin okaň) berlen iş . “RunLoop print("B") : ACB Jogap 2-nji wezipe print(“A”) DispatchQueue.main.async { print(“B”) } DispatchQueue.main.async { print(“C”) } print(“D”) Esasy sapakda ýerine ýetirilýär. print("A") esasy nobata ýazylýar. Esasy sapak elýeterli bolýança esasy nobat. print("B") çap edilenden soň berilýär ("B") we garaşýar. print("C") Esasy sapak ýerine ýetirilmegini dowam etdirýär we "D" çap edýär. Esasy sapak elýeterli bolanda (beýleki RunLoop meselelerini ýerine ýetireniňizden soň), birinji nobatdaky amal ýerine ýetirilýär. print("B") Esasy sapak täzeden erkin bolansoň (beýleki RunLoop meselelerini ýerine ýetirenimden soň - geljekde bu jikme-jigi umumy tertibe täsir etmeýänligi üçin goýaryn), . print("C") : ADBC Jogap Käbir mysallarda düşündirişi birneme ýönekeýleşdirjekdigimi we ulgamyň sinhron jaňlaryň ýerine ýetirilişini optimallaşdyrýandygyny, soňrak ara alyp maslahatlaşjakdygymy ýatdan çykarmaly däl. 3-nji wezipe 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”) } esasy sapakda ýerine ýetirilýär. print("A") Asynkron mesele (1–3 belgili) häzirki (esasy) sapagy ýapmazdan esasy nobata ýazylýar. Esasy sapak ýerine ýetirilmegini dowam etdirýär we çap edýär. "F" amaly, öňki ýumuşdan soň (1–3 ädimler) esasy nobata ýazylýar. print("G") Esasy sapak erkin bolansoň, birinji nobatdaky amal - ýerine ýetirilýär. print("B") soňra esasy nobata ýazylýar (häzirki wezipe henizem ýerine ýetirilýär we nobatda durýar). Asynhron görnüşde goşulandygy sebäpli, ýerine ýetirilmegine garaşmaýarys we derrew dowam edýäris. print("C") print("G") Ondan soň, operasiýasy global nobata ýazylýar. Bu çagyryş sinhron bolany üçin, dowam etmezden ozal global nobat ýerine ýetirilýänçä garaşýarys (islendik işçi sapagynda işlemegi mümkin). print("D") Ahyrynda amaly esasy nobata ýazylýar. Bu jaň sinhron bolansoň, häzirki sapak ýumuş gutarýança petiklenmeli. Şeýle-de bolsa, esasy nobatda eýýäm meseleler bar we amaly soňundan soň goşulýar. Şol sebäpli, bu amallar . Mainöne esasy sapak häzirki amaly ýerine ýetirmek bilen meşgullanýar, şonuň üçin indiki nobatdaky amallara geçip bilmez. Häzirki amaldan soň we çap etmek üçin hiç hili amal bolmasa-da, häzirki amal (1-3 ädimler) entek gutarmansoň, sapak dowam edip bilmedi. print("E") print("E") print("E") "G" "C" Çagyryş birkemsiz bolan bolsa, we çap etmek amallaryndan soň çap etmek ("E") amal ediler. "G" "C" : AFBD Jogap (ikinji jaň bolan bolsa): AFBDGCE Alternatiw jogap async 4-nji wezipe let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”) serialQueue.async { // 1 print(“A”) serialQueue.sync { print(“B”) } print(“C”) } // 2 Bir mesele (1-2 ädimler) adaty seriýa nobatynda asynkron görnüşde berilýär (tertip boýunça atributyny ulanmaýandygymyz üçin nobatlar yzygiderli). .concurrent Ulgam serişdeleri bölüp berende, ýerine ýetiriş başlaýar we çap edilýär. "A" Şol bir yzygiderli nobatda, berilýär. Çagyryş sinhron bolany üçin, ýerine ýetirilmegine garaşýan sapak bloklary. print("B") Şeýle-de bolsa, nobat yzygiderli we daşarky 1-2 iş bilen meşgul bolansoň, işi başlap bilmez, netijede petiklener. print("B") : A, petik Jogap Bu mysal, esasy nobat bolsun ýa-da adaty bir nobat bolsun, islendik nobatda nobatyň bolup biljekdigini görkezýär. 5-nji wezipe Öňki ýumuşdan yzygiderli nobaty yzygiderli ýerine çalyşalyň. DispatchQueue.global().async { // 1 print("A") DispatchQueue.global().sync { print("B") } print("C") } // 2 Bir mesele (1-2 ädim) global (yzygiderli) nobatda asynkron görnüşde berilýär. Çeşmeler bölünende ýerine ýetiriş başlaýar we çap edilýär. "A" Şol bir global nobatda ýerine ýetirmek üçin sinhron jaň edilýär, bu iş gutarýança häzirki işçi ýapýar. print("B") sapagyny Bu ýagdaýda, ýüplük petiklenen hem bolsa, global nobat birmeňzeş bolansoň, indiki amaly ýerine ýetirip, häzirki işiniň gutarmagyna garaşman, başga bir sapakda işledip biler. Şeýlelik bilen, çagyryş sapagy işiniň başga bir işçi sapagynda ýerine ýetirilmegine garaşýar. print("B") Wezipe gutaransoň, başlangyç jaň sapagy açylýar, çap edilýär. "C" : ABC Jogap 6-njy wezipe 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") Esasy sapak çap edýär. "A" Asynkron däl mesele (1–8 ädimler) häzirki sapagy petiklemän esasy nobata ýazylýar. Esasy sapak dowam edýär we çap edilýär. "I" Soň bolsa, esasy sapak mugt bolanda, esasy nobata berlen ýerine ýetiriş başlaýar we çap edilýär. "B" Başga bir asynkron mesele (2-5 ädim) esasy nobata ýazylýar - häzirki sapagy petiklemeýär. Häzirki sapakda ýerine ýetirilmegini dowam etdirmek bilen, 6–7 amaly sinhron iberiş global nobata iberilýär - bu iş gutarýança häzirki (esasy) sapagy bloklaýar. 6-7-nji amal, çap edip, başga bir sapakda ýerine ýetirilip başlaýar. "F" amaly, häzirki işçi sapagyny gutarýança blokirläp, global nobata sinhron iberilýär. print("G") çap edilýär we bu amalyň iberilen işçi sapagy açylýar. "G" 6-7-nji amal tamamlanýar, iberilen sapagy (esasy sapak) açýar we çap edilýär. "H" 1–2 amal gutarandan soň, ýerine ýetiriş esasy nobatda indiki işe - 2–5 operasiýasyna geçýär we başlaýar we çap edilýär. "C" 3–4-nji amal, sapagy ýapmazdan esasy nobata ýazylýar. Häzirki amal (2–5) gutaransoň, ýerine ýetiriş indiki amalda (3–4) başlaýar we çap edilýär. "D" amaly, häzirki sapagy petikläp, esasy nobata sinhron iberilýär. print("G") Soňra ulgam esasy sapagyň ýerine ýetirilmegi üçin edilmegine belli bir wagt garaşýar, sebäbi sapak petiklenensoň, bu petiklenýär. print("E") : AIBFGHCD, petik Jogap Aralyk maşklar Aralyk kynçylygyň wezipeleri näbelliligi öz içine alýar. Şeýle meseleler seýrek bolsa-da, söhbetdeşliklerde duş gelýär. 7-nji wezipe DispatchQueue.global().async { print("A") } DispatchQueue.global().async { print("B") } häzirki sapagy petiklemän, global nobatda asynkron görnüşde ýazylýar. print("A") Ulgamyň global nobatda wezipe üçin çeşmeler paýlamagyna garaşýarys. Teoriýa boýunça, bu islendik pursatda, hatda . Bu aýratyn ýagdaýda indiki nobat ilki nobata goşulýar we diňe şondan soň global nobata bölünip berilýär. Bu, esasy sapak iň köp çeşme bölünip berlenligi sebäpli bolup geçýär we esasy sapakdaky indiki amal gaty ýeňil (diňe bir mesele goşmak bilen) we iş ýüzünde global nobatda çeşme paýlanyşyndan has çalt ýüze çykýar. Munuň tersini indiki bölümde ara alyp maslahatlaşarys. print("B") global nobata ýazylýar. print("B") Bu aralykda, global nobat çeşme paýlanyşyna garaşýan mahaly esasy sapak dowam edýär. Çeşmeler elýeterli bolanda, iki mesele hem ýerine ýetirilýär. meseläni çap etmek -den has ir başlasa-da, buýrugy kepillendirip bilmeris, sebäbi çap etmek atom operasiýasy däl (konsolda çykýan pursat amalyň ahyrynda). "A" "B" : (AB) Jogap Gaplaň, harplaryň islendik tertipde peýda bolup biljekdigini görkezýär: AB ýa-da BA. 8-nji wezipe print("A") DispatchQueue.main.async { print("B") } DispatchQueue.global().async { print("C") } Bu ýerde diňe "A" -yň ilki çap edilendigine göz ýetirip bileris. Esasy nobatdaky ýa-da global nobatdaky meseläniň has çalt ýerine ýetiriljekdigini takyk kesgitläp bilmeris. : A (BC) Jogap 9-njy wezipe DispatchQueue.global(qos: .userInteractive).async { print(“A”) } DispatchQueue.main.async { // 1 print(“B”) } we DispatchQueue.global(qos: .userInteractive).async { print(“A”) } print(“B”) // 1 Bir tarapdan, iki ýagdaýda-da esasy sapakda ýerine ýetirilýär. Mundan başga-da, global nobatyň haçan bölünip beriljekdigini takyk kesgitläp bilmeris, şonuň üçin teoretiki taýdan esasy sapakda // 1 bellenen nokada ýetmänkä çap edilip bilner. Emma iş ýüzünde birinji wezipe hemişe AB görnüşinde, ikinjisi BA görnüşinde çap edilýär. Sebäbi birinji ýagdaýda iň bolmanda esasy sapagyň indiki RunLoop gaýtalanyşynda ýerine ýetirilýär (ýa-da birnäçe gezek gaýtalanýar), ikinji ýagdaýda esasy sapakdaky häzirki RunLoop iterasiýasynda işlemeli. Şeýle-de bolsa, buýrugy kepillendirip bilmeris. print("B") "A" print("B") print("B") Iki meselä-de : (AB) jogap 10-njy wezipe print("A") DispatchQueue.global().async { print("B") DispatchQueue.global().async { print("C") } print("D") } Çykyşyň başlangyjynyň bolandygy düşnüklidir. Çap edilenden soň , çeşmeleriň haçan bölünjekdigini takyk kesgitläp bilmeris - bu mesele . Bu käwagt iş ýüzünde-de bolýar. "AB" print("C") print("D") : AB (CD) Jogap 11-nji wezipe let serialQueue = DispatchQueue(label: “com.kirylfamin.serial”, qos: .userInteractive) DispatchQueue.main.async { print(“A”) serialQueue.async { print(“B”) } print(“C”) } Againene-de, ýörite nobatda çap etmek üçin ("B") çeşmeleriň haçan bölünjekdigini takyk kesgitläp bilmeris. Iş ýüzünde, esasy sapaga iň ýokary ähmiýet berilýändigi sebäpli, "C" adatça "B" -den öň çap edilýär, ýöne bu kepillendirilmeýär. : A (BC) Jogap 12-nji wezipe DispatchQueue.global().async { print("A") } print("B") sleep(1) print("C") Bu ýerde çykyşyň BAC boljakdygy äşgärdir, sebäbi bir sekuntlyk uky global nobatyň çeşmeler paýlamak üçin ýeterlik wagtyny üpjün edýär. Esasy sapak uky bilen petiklenýän bolsa (önümçilikde etmeli däl), başga bir sapakda . print("A") : BAC Jogap 13-nji wezipe DispatchQueue.main.async { print("A") } print("B") sleep(1) print("C") Bu ýagdaýda esasy nobata ýazylanlygy sebäpli, diňe esasy sapakda ýerine ýetirilip bilner. Şeýle-de bolsa, esasy sapak kody ýerine ýetirmegi dowam etdirýär - çap etmek, soň uklamak, soňra çap etmek. Diňe şondan soň “RunLoop” berlen işi ýerine ýetirip biler. print("A") "B" "C" : BCA Jogap Ösen meseleler Söhbetdeşliklerde bu kynçylyklara duş gelmek ähtimallygyňyz ýok, ýöne olara düşünmek GCD-ni has gowy düşünmäge kömek eder. Bu ýerdäki “Counter” synpy diňe salgylanma semantikasy üçin ulanylýar: final class Counter { var count = 0 } 14-nji wezipe let counter = Counter() DispatchQueue.global().async { DispatchQueue.main.async { print(counter.count) } for _ in (0..<100) { // 1 counter.count += 1 } } Bu ýerde esasy sapagyň näderejede meşguldygyna baglylykda 0 bilen 100 aralygyndaky islendik san çap edilip bilner. Bilşimiz ýaly, asynkron meseläniň haçan çeşme aljakdygyny takyk çaklap bilmeris - bu işçiniň sapagyndan öň, wagtynda ýa-da soň bolup biler. : 0-100 Jogap 15-nji wezipe DispatchQueue.global(qos: .userInitiated).async { print(“A”) } DispatchQueue.global(qos: .userInteractive).async { print(“B”) } QoS, has ileri tutulýan nobatyň has çalt çeşme aljakdygyny kepillendirmeýär, emma iOS muny etmäge synanyşar. Iş ýüzünde bu ýerdäki çykyş (AB). : (AB) Jogap 16-njy wezipe 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”) } Ilki haýsy ýerine ýetirişiň başlanýandygyny bilip bilmeýändigimiz sebäpli, hatda 1000 amalda-da haýsy meseläniň has çalt tamamlanjakdygyny kesgitläp bilmeris. : (AB) Jogap 16.2-nji wezipe Amallaryň bir wagtda ýerine ýetirip başlamagyny göz öňünde tutýan netije näme? .UserInteractive nobaty has köp çeşme bölünip berilýändigi sebäpli, 1000 amalyň dowamynda bu nobatyň ýerine ýetirilmegi elmydama has çalt tamamlanar. : BA Jogap 17-nji wezipe Şuňa meňzeş çemeleşmäni ulanyp, islendik bölümi öňki bölümdäki näbellilik bilen üýtgedip bileris (mysal üçin, 12-nji wezipe): 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 } } 0 bilen 100 aralygyndaky islendik san çap edilip bilner. 0-yň çap edilip bilinjekdigi, 12-nji ýumuşda çykarylyşynyň öň hemişe bolup biljekdigini kepillendirip bilmeris, aslynda hiç zat üýtgemedi - diňe aýlaw çapdan has az serişde talap edýär (aýlawy ýerine ýetirmekden ozal hem iş ýüzünde doly näbellilige sebäp bolandygyny belläň). "C" "B" : 0-100 Jogap 18-nji wezipe DispatchQueue.global(qos: .userInitiated).async { print(“A”) } print(“B”) DispatchQueue.global(qos: .userInteractive).async { print(“C”) } Bu ýerde şuňa meňzeş ýagdaý ýüze çykýar. Teoriýa boýunça has çalt ýerine ýetirip biler (eger birneme agyrrak zat bilen çalşsaňyz). Iş ýüzünde hemişe ilki çap edilýär. Şeýle-de bolsa, ýerine ýetirilýändigimiz, -den öň çap edilmek ähtimallygyny ep-esli ýokarlandyrýar, sebäbi esasy sapakda sarp edilýän goşmaça wagt köplenç .userInitiated nobata çeşme almak we üçin ýeterlikdir. Muňa garamazdan, bu kepillendirilmeýär we käwagt has çalt çap edilip bilner. Şeýlelik bilen, teoriýada doly näbellilik bar; iş ýüzünde B (CA) bolýar. print("A") print("B") print("B") "B" print("B") print("C") "A" "C" print("B") print("A") "C" : (BCA) Jogap 19-njy wezipe DispatchQueue.global().sync { print(Thread.current) } Sinhronlamak üçin : resminamalar "Netijeli optimizasiýa hökmünde bu funksiýa mümkin boldugyça häzirki sapakdaky bloklary ýerine ýetirýär, bir kadadan çykma: esasy iberiş nobatyna iberilen bloklar hemişe esasy sapakda işleýär." Diýmek, optimizasiýa maksady bilen sinhron jaňlar çagyrylan şol bir sapakda ýerine ýetirilip bilner ( -dan başga - ony ulanýan meseleler hemişe esasy sapakda ýerine ýetirilýär). Şeýlelikde, häzirki (esasy) sapak çap edilýär. main.sync : esasy sapak Jogap 20-nji wezipe DispatchQueue.global().sync { // 1 print(“A”) DispatchQueue.main.sync { print(“B”) } print(“C”) } Diňe çap edilýär, sebäbi petik ýüze çykýar. Optimizasiýa sebäpli mesele (1 bellikli) esasy sapakda ýerine ýetirilip başlaýar we soňra jaň etmek petiklige sebäp bolýar. "A" main.sync : А, petik Jogap 21-nji wezipe DispatchQueue.main.async { print("A") DispatchQueue.global().sync { print("B") } print("C") } Optimizasiýa meselesiniň däl-de, häzirki ýerine ýetiriş sapagyna "bölünmegine" sebäp bolýar. Şeýlelikde, kod: print("B") DispatchQueue.global().sync { print("B") } bilen deňleşýär: print(“B”) : ABC Jogap Bu meselelerden, esasy.sync-y gaty ünsli ulanmalydygyňyz aýdyň, diňe jaňyň esasy sapakdan edilmeýändigine göz ýetireniňizde. Netije Bu makalada, iOS-da köp okalmagyň esasy düşünjelerine - sapaklara, meselelere we nobatlara we olaryň özara baglanyşyklaryna ünsi jemledik. GCD-iň esasy, global we adaty nobatlar boýunça meseleleriň ýerine ýetirilişini nädip dolandyrýandygyny öwrendik we yzygiderli we yzygiderli ýerine ýetirişiň arasyndaky tapawutlary ara alyp maslahatlaşdyk. Mundan başga-da, sinhron (sinhron) we asynkron (asynk) mesele iberişiniň arasyndaky möhüm tapawutlary gözden geçirdik, bu çemeleşmeleriň kod ýerine ýetiriş tertibine we wagtyna nähili täsir edýändigini görkezdik. Bu esasy düşünjeleri özleşdirmek, täsirli, durnukly goşundylary gurmak we petik ýaly umumy duzaklardan gaça durmak üçin zerurdyr. Bu makalada peýdaly bir zat taparsyňyz diýip umyt edýärin. Bir zat düşnüksiz bolsa, Telegram: hakda mugt düşündiriş almak üçin maňa ýüz tutuň. @kfamyn Degişli baglanyşyklar Animhli animasiýalar bilen YouTube kanaly - https://www.youtube.com/@kirylfamin Maşklaryň doly kody - https://github.com/kfamyn/GCD-Tasks Meniň telegramma - http://t.me/kfamyn RunLoop - https://developer.apple.com/documentation/foundation/runloop usuly resminamalary - sync https://developer.apple.com/documentation/dispatch/dispatchqueue/sync(execute:)-3segw