Middle
Co je Grand Central Dispatch a jak se používá v vývoji iOS?
sobes.tech AI
Odpověď od AI
Grand Central Dispatch (GCD) je nízkoúrovňové API pro správu více vláken, které poskytuje sadu systémových vláken a plánuje jejich vykonávání.
Hlavní koncepty GCD:
- Dispatch Queue: Fronty, do kterých jsou umístěny bloky kódu (úkoly) k vykonání.
- Sériové fronty: Vykonávají bloky v pořadí přidání, po jednom.
- Paralelní fronty: Vykonávají bloky paralelně, ale v pořadí přidání.
- Úkoly (Bloky): Jednotky práce, které jsou odesílány do dispatch front.
- Dispatch Sources: Monitorování systémových událostí (soubory, sokety, signály), které volají vykonání bloků při jejich vzniku.
Použití:
-
Vykonávání úloh na pozadí: Načítání dat ze sítě, zpracování obrázků, složité výpočty, aby hlavní vlákno (UI) nebylo blokováno.
DispatchQueue.global(qos: .userInitiated).async { // Vykonání náročné operace let processedData = performHeavyProcessing() DispatchQueue.main.async { // Aktualizace UI na hlavním vlákně updateUI(with: processedData) } } -
Plánování úloh: Odložené vykonání nebo periodické vykonání.
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Tento kód se vykoná za 2 sekundy print("Odložené vykonání") } -
Synchronizace přístupu k datům: Použití sériových front nebo
DispatchQueue.concurrentPerformpro kontrolu paralelního přístupu.let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent) var sharedArray = [Int]() func addItem(_ item: Int) { syncQueue.async(flags: .barrier) { // Použití .barrier pro exkluzivní přístup při zápisu sharedArray.append(item) } } func processItems() { syncQueue.sync { // Synchronous read for item in sharedArray { print(item) } } }
Výhody oproti ruční správě vláken (POSIX vlákna):
- Jednodušší použití: Vyšší úroveň abstrakce.
- Efektivita: GCD efektivněji spravuje sadu systémových vláken, snižuje režii.
- Škálovatelnost: Automaticky se přizpůsobuje počtu jader procesoru.
Typy QoS (Kvalita služby): Určuje prioritu úkolu pro plánovač GCD.
| QoS | Použití |
|---|---|
| userInteractive | Aktualizace UI, animace, rychlá reakce |
| userInitiated | Úkoly iniciované uživatelem, vyžadující rychlé dokončení (stahování, zpracování fotografií) |
| default | Výchozí priorita, mezi userInitiated a utility |
| utility | Dlouhotrvající úkoly bez naléhavosti (stahování, indexování) |
| background | Úkoly na pozadí, neviditelné uživateli (zálohování, synchronizace na pozadí) |
| unspecified | Priorita není nastavena, určuje ji systém |