Sobes.tech
Middle

Šta je Grand Central Dispatch i kako se koristi u razvoju iOS?

sobes.tech АИ

Одговор од АИ

Grand Central Dispatch (GCD) — niskonivojsko API za upravljanje višestrukim nitima, koje pruža skup sistemskih niti i planira izvršavanje zadataka na njima.

Osnovne koncepcije GCD:

  • Dispatch Queue: Redovi u koje se smeštaju blokovi koda (zadaci) za izvršenje.
    • Serijske Queue: Izvršavaju blokove u redosledu dodavanja, po jedan.
    • Paralelne Queue: Izvršavaju blokove paralelno, ali u redosledu dodavanja.
  • Zadaci (Blokovi): Jedinice rada koje se šalju u Dispatch Queue.
  • Dispatch Sources: Monitoring sistemskih događaja (datoteke, soketi, signali), koji pozivaju izvršenje blokova pri njihovom nastanku.

Koristi se za:

  1. Izvršavanje pozadinskih operacija: Učitavanje podataka sa mreže, obrada slika, složeni proračuni, kako ne bi blokirali glavni tok (UI).

    DispatchQueue.global(qos: .userInitiated).async {
        // Izvršavanje zahtevne operacije
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Ažuriranje UI na glavnom thread-u
            updateUI(with: processedData)
        }
    }
    
  2. Planiranje zadataka: Odloženo izvršavanje ili periodično izvršavanje.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Ovaj kod će se izvršiti za 2 sekunde
        print("Odloženo izvršavanje")
    }
    
  3. Sinhronizacija pristupa podacima: Korišćenje serijskih queue ili DispatchQueue.concurrentPerform za kontrolu paralelnog pristupa.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Korišćenje .barrier za ekskluzivan pristup pri pisanju
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Sinhrono čitanje
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Prednosti u odnosu na ručno upravljanje nitima (POSIX niti):

  • Jednostavnije korišćenje: Viši nivo apstrakcije.
  • Efikasnost: GCD efikasnije upravlja skupom sistemskih niti, smanjujući troškove.
  • Skalabilnost: Automatski se prilagođava broju jezgara procesora.

Tipovi QoS (Kvalitet usluge): Određuje prioritet zadatka za planera GCD.

QoS Primena
userInteractive Ažuriranja UI, animacije, brza reakcija
userInitiated Zadaci koje inicira korisnik, zahtevaju brzo završavanje (preuzimanje, obrada fotografija)
default Podrazumevani prioritet, između userInitiated i utility
utility Dugotrajni zadaci bez hitnosti (preuzimanje, indeksiranje)
background Zadaci u pozadini, nevidljivi korisniku (rezervno kopiranje, sinhronizacija u pozadini)
unspecified Prioritet nije postavljen, određuje ga sistem