Sobes.tech
Middle

Kas yra Grand Central Dispatch ir kaip jis naudojamas iOS kūrime?

sobes.tech AI

Atsakymas iš AI

Grand Central Dispatch (GCD) — žemo lygio API, skirtas daugiabriaunių procesų valdymui, kuris teikia sisteminių gijų pulą ir planuoja užduočių vykdymą jomis.

GCD pagrindinės sąvokos:

  • Dispatch Queue: eilės, į kurias dedami kodo blokai (užduotys) vykdymui.
    • Seryvinės eilės: vykdo blokus pagal pridėjimo tvarką, po vieną.
    • Paralelios eilės: vykdo blokus lygiagrečiai, bet pagal pridėjimo tvarką.
  • Užduotys (Blokai): darbo vienetai, kurie siunčiami į Dispatch eilutes.
  • Dispatch Sources: stebės sistemos įvykius (failus, lizdus, signalus), kurie iškviečia blokų vykdymą jų atsiradimo metu.

Naudojimas:

  1. Fono operacijų vykdymas: duomenų įkėlimas iš tinklo, vaizdų apdorojimas, sudėtingi skaičiavimai, kad pagrindinė gija (UI) nebūtų užblokuota.

    DispatchQueue.global(qos: .userInitiated).async {
        // Resursų intensyvi operacija
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // UI atnaujinimas pagrindinėje gijoje
            updateUI(with: processedData)
        }
    }
    
  2. Užduočių planavimas: atidėtas vykdymas arba periodinis vykdymas.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Šis kodas bus vykdomas po 2 sekundžių
        print("Atidėtas vykdymas")
    }
    
  3. Prieigos prie duomenų sinchronizavimas: naudojant serijines eilutes arba DispatchQueue.concurrentPerform kontrolę.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Naudojant .barrier, siekiant išskirtinio prieigos
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Sinchroninis skaitymas
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Pranašumai prieš rankinį sriegių valdymą (POSIX threads):

  • Lengviau naudoti: aukštesnio lygio abstrakcija.
  • Efektyvumas: GCD efektyviau valdo sisteminių sriegių pulą, mažina išlaidas.
  • Mastelio keitimas: automatiškai prisitaiko prie procesoriaus branduolių skaičiaus.

QoS tipai (Paslaugos kokybė): nustato užduoties prioritetą GCD planuotojui.

QoS Pritaikymas
userInteractive UI atnaujinimai, animacijos, greita reakcija
userInitiated Vartotojo inicijuotos užduotys, reikalaujančios greito užbaigimo (įkėlimas, nuotraukų apdorojimas)
default Numatytoji prioritetas, tarp userInitiated ir utility
utility Ilgalaikės užduotys be skubos (įkėlimas, indeksavimas)
background Fono užduotys, nematomos vartotojui (atsarginė kopija, sinchronizacija fone)
unspecified Prioritetas nenustatytas, nustato sistema