Sobes.tech
Middle

Ką galite pasakyti apie Grand Central Dispatch ir jo naudojimą iOS kūrime?

sobes.tech AI

Atsakymas iš AI

Grand Central Dispatch (GCD) — tai žemo lygio API, pagrįstas asinchroninio užduočių vykdymo koncepcija daugiabrandžių procesorių sistemoms. Jis teikia siuntinių eilutes, kurias valdo sistema, atlaisvindamas programuotoją nuo rankinio siuntinių kūrimo ir valdymo:

Pagrindiniai komponentai:

  • Siuntinių eilutės (Dispatch Queues): Duomenų struktūros, saugančios užduočių blokus (workItem) vykdymui. Užduotys vykdomos pagal pridėjimo tvarką:

    • Serijinės eilutės (Serial Queues): Vykdo užduotis po vieną, pagal pridėjimo tvarką. Užtikrina vykdymo tvarką ir duomenų saugumą, kurie keičiami tik vienoje eilutėje:
    • Lygiagrečios eilutės (Concurrent Queues): Vykdo užduotis lygiagrečiai, naudodamos prieinamus sisteminius išteklius. Baigimo tvarka nėra garantuota:
      • Globalios lygiagrečios eilutės (Global Concurrent Queues): Teikiamos sistema su skirtingais prioritetais (qos): .userInteractive, .userInitiated, .default, .utility, .background:
    • Pagrindinė eilutė (Main Queue): Speciali serijinė eilutė, susieta su pagrindiniu programos srautu (main thread). Naudojama UI atnaujinimui:
  • Užduočių blokai (Work Items): Užuolankiai (closures) arba funkcijos, kurias GCD siunčia vykdymui:

  • Siuntinių grupės (Dispatch Groups): Leidžia vykdyti užduotis keliuose eilutėse ir gauti pranešimą apie visų užduočių pabaigą grupėje:

  • Siuntinių semaforai (Dispatch Semaphores): Mechanizmas, skirtas apriboti vienu metu prieinamų srautų skaičių arba sinchronizuoti tarp srautų:

Naudojimas iOS kūrime:

  • Asinchroninis užduočių vykdymas: Perkelti resursų intensyvias operacijas (tinklo užklausas, duomenų bazės darbą, vaizdų apdorojimą) iš pagrindinio srauto, siekiant išlaikyti UI reakciją:
    let queue = DispatchQueue.global(qos: .userInitiated)
    queue.async {
        // Resursų intensyvi operacija
        let result = performHeavyCalculation()
    
        DispatchQueue.main.async {
            // UI atnaujinimas pagrindiniame sraute
            self.updateUI(with: result)
        }
    }
    
  • Sinchronizacija:
    • Semaforų naudojimas, siekiant apriboti prieigą prie bendro naudojimo išteklių:
      let semaphore = DispatchSemaphore(value: 1) // leidžia 1 srautui pasiekti
      semaphore.wait() // laukia, kol semaforas taps prieinamas
      // Prieiga prie bendro ištekliaus
      semaphore.signal() // atlaisvina semaforą
      
    • Serijinės eilutės duomenų saugumui užtikrinti:
  • Grupinis užduočių vykdymas: kelių asinchroninių užduočių vykdymas ir jų pabaigos laukimas:
    let group = DispatchGroup()
    let concurrentQueue = DispatchQueue.global()
    
    group.enter() // įėjimas į grupę
    concurrentQueue.async {
        // Užduotis 1
        print("Užduotis 1 baigta")
        group.leave() // išėjimas iš grupės
    }
    
    group.enter()
    concurrentQueue.async {
        // Užduotis 2
        print("Užduotis 2 baigta")
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Visos užduotys grupėje baigtos
        print("Visos užduotys baigtos")
    }
    
  • Atidėtas vykdymas: Kodo vykdymas po nustatyto laiko:
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Kodas bus vykdomas po 2 sekundžių
        print("Atidėtas vykdymas")
    }
    

GCD privalumai:

  • Paprastas naudojimas, palyginti su rankiniu srautų valdymu:
  • Sistemos valdomas siuntinių pultas, optimizuotas daugiabrandiniams procesoriams:
  • Efektyvus išteklių naudojimas:
  • Vengti problemų, susijusių su rankiniu srautų valdymu (konkurencijos būsenos, tarpusavio blokavimas):

GCD trūkumai:

  • Mažiau lankstus nei rankinis valdymas kai kuriose sudėtingose scenarijuose:
  • Daugiagyslio kodo derinimas gali būti sudėtingas.