Sobes.tech
Middle

Čo je Grand Central Dispatch a ako sa používa pri vývoji iOS?

sobes.tech AI

Odpoveď od AI

Grand Central Dispatch (GCD) — nízkoúrovňové API na správu viacvlákien, ktoré poskytuje súbor systémových vlákien a plánuje ich vykonávanie.

Hlavné koncepty GCD:

  • Dispatch Queue: Fronty, do ktorých sa umiestňujú bloky kódu (úlohy) na vykonanie.
    • Sériové Queue: Vykonávajú bloky v poradí pridania, po jednom.
    • Paralelné Queue: Vykonávajú bloky paralelne, ale v poradí pridania.
  • Úlohy (Bloky): Jednotky práce, ktoré sa odosielajú do dispatch front.
  • Dispatch Sources: Monitorovanie systémových udalostí (súbory, sokety, signály), ktoré volajú vykonanie blokov pri ich vzniku.

Použitie:

  1. Vykonávanie úloh na pozadí: Načítanie dát zo siete, spracovanie obrázkov, zložité výpočty, aby hlavný vlákno (UI) nebolo blokované.

    DispatchQueue.global(qos: .userInitiated).async {
        // Vykonanie náročnej operácie
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Aktualizácia UI na hlavnom vlákne
            updateUI(with: processedData)
        }
    }
    
  2. Plánovanie úloh: Odložené vykonanie alebo periodické vykonanie.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Tento kód sa vykoná za 2 sekundy
        print("Odložené vykonanie")
    }
    
  3. Synchronizácia prístupu k dátam: Použitie sériových front alebo DispatchQueue.concurrentPerform na kontrolu paralelného prístupu.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Použitie .barrier pre exkluzívny prístup pri zápise
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Synchronous read
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Výhody oproti ručnému riadeniu vlákien (POSIX vlákna):

  • Jednoduchšie použitie: Vyššia úroveň abstrakcie.
  • Efektívnosť: GCD efektívnejšie spravuje súbor systémových vlákien, znižujúc režijné náklady.
  • Škálovateľnosť: Automaticky sa prispôsobuje počtu jadier procesora.

Typy QoS (Kvalita služby): Určuje prioritu úlohy pre plánovač GCD.

QoS Použitie
userInteractive Aktualizácie UI, animácie, rýchla reakcia
userInitiated Úlohy iniciované používateľom, ktoré vyžadujú rýchle dokončenie (sťahovanie, spracovanie fotografií)
default Predvolená priorita, medzi userInitiated a utility
utility Dlhé trvajúce úlohy bez naliehavosti (sťahovanie, indexovanie)
background Úlohy na pozadí, neviditeľné používateľovi (zálohovanie, synchronizácia na pozadí)
unspecified Priorita nie je nastavená, určuje ju systém