Grand Central Dispatch жана анын iOS өнүктүрүүдөгү колдонулушу жөнүндө эмне айта аласыз?
sobes.tech AI
AIден жооп
Grand Central Dispatch (GCD) — бул төмөн деңгээлдүү API, ал көп ядролу процессорлордо асинхрондуу тапшырмаларды ишке ашыруу концепциясына негизделген. Ал системанын башкаруусунда пулдар менен камсыз кылынган, программалаочу тарабынан жекече түзүү жана башкаруу иштеринен бошотот:
Негизги компоненттери:
-
Таркатуучулардын кезектери (Dispatch Queues): Ишке ашыруу үчүн тапшырмалардын (workItem) блокторун сактайт структуралар. Тапшырмалар кошулуу тартибинде ишке ашырылат:
- Жалгыз кезектер (Serial Queues): Тапшырмаларды бирден ишке ашырат, кошулуу тартибинде. Ишке ашыруу тартибин жана маалыматтын коопсуздугун камсыздайт, ал бир кезекте гана өзгөртүлөт:
- Көптөгөн кезектер (Concurrent Queues): Тапшырмаларды бир мезгилде ишке ашырат, системанын жеткиликтүү ресурстарын колдонуп. Аягына чыгуу тартиби кепилденбейт:
- Глобалдык көптөгөн кезектер (Global Concurrent Queues): Жүйе тарабынан ар кандай приоритеттер менен берилет (qos):
.userInteractive,.userInitiated,.default,.utility,.background:
- Глобалдык көптөгөн кезектер (Global Concurrent Queues): Жүйе тарабынан ар кандай приоритеттер менен берилет (qos):
- Негизги кезек (Main Queue): Специальдүү кезек, колдонмонун негизги агымына байланыштуу (main thread). UI жаңыртуу үчүн колдонулат:
-
Иштердин блоктору (Work Items): GCD жиберген клоузурлар же функциялар:
-
Таркатуучулардын топтору (Dispatch Groups): Бир нече кезектерде тапшырмаларды ишке ашырып, топтун бардык тапшырмалары аяктагандан кийин кабарлоо алууга мүмкүндүк берет:
-
Таркатуучулардын семафорлору (Dispatch Semaphores): Ресурска бир мезгилде кайрылган потоктордун санын чектөө же потоктор ортосунда синхрондоштуруу үчүн механизм:
iOS иштеп чыгууда колдонуу:
- Асинхрондуу тапшырмаларды ишке ашыруу: Ресурс талап кылган операцияларды (желілік суроолор, маалымат базасы менен иштөө, сүрөттөрдү иштетүү) негизги агымдан которуп, UI жоопкерчилигин сактоо:
let queue = DispatchQueue.global(qos: .userInitiated) queue.async { // Арыздуу операцияны ишке ашыруу let result = performHeavyCalculation() DispatchQueue.main.async { // UI жаңыртуу негизги агымда self.updateUI(with: result) } } - Синхрондаштыруу:
- Семапорлор менен бөлүштүрүлгөн ресурстарга кирүүнү чектөө:
let semaphore = DispatchSemaphore(value: 1) // 1 потокка кирүүгө уруксат берет semaphore.wait() // Семапор жеткиликтүү болгонго чейин күтөт // Бөлүштүрүлгөн ресурска кирүү semaphore.signal() // Семапорду бошотуу - Жалгыз кезектер менен маалыматтын коопсуздугун камсыздоо:
- Семапорлор менен бөлүштүрүлгөн ресурстарга кирүүнү чектөө:
- Топтолгон тапшырмаларды ишке ашыруу: Бир нече асинхрондуу тапшырмаларды ишке ашырып, алардын аяктоосун күтүү:
let group = DispatchGroup() let concurrentQueue = DispatchQueue.global() group.enter() // Топко кирүү concurrentQueue.async { // Тапшырма 1 print("Тапшырма 1 аяктады") group.leave() // Топтон чыгуу } group.enter() concurrentQueue.async { // Тапшырма 2 print("Тапшырма 2 аяктады") group.leave() } group.notify(queue: .main) { // Бардык тапшырмалар топто аяктады print("Бардык тапшырмалар аяктады") } - Кечиктирилген ишке ашыруу: Кодду белгилүү убакыттан кийин ишке ашыруу:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Код 2 секунддан кийин ишке ашырылат print("Кечиктирилген ишке ашыруу") }
GCDнин артыкчылыктары:
- Колдонуу жөнөкөй, ручной башкарууга салыштырмалуу:
- Жүйе тарабынан башкарылуучу пул, көп ядролу процессорлор үчүн оптималдаштырылган:
- Эффективдүү ресурстарды колдонуу:
- Ручной башкаруу менен байланышкан көйгөйлөрдөн (күрөшүү шарттары, өз ара блокировка) качуу:
GCDнин кемчиликтери:
- Кээде көбүрөөк ийкемдүү эмес, ручной башкаруу менен салыстырганда, айрым татаал сценарийлерде:
- Көп агымдуу кодду дебагдоо кыйын болушу мүмкүн.