Sobes.tech
Middle

Mis on Grand Central Dispatch ja kuidas seda kasutatakse iOS arenduses?

sobes.tech AI

Vastus AI-lt

Grand Central Dispatch (GCD) — madala taseme API mitme ülesande haldamiseks, mis pakub süsteemipõhiseid niite ja planeerib nende täitmist.

GCD põhimõisted:

  • Dispatch järjekorrad: Järjekorrad, kuhu paigutatakse koodilõigud (ülesanded) täitmiseks.
    • Süntesaadid järjekorrad: Täidavad lõike vastavalt lisamise järjekorrale, üks korraga.
    • Võistlevad järjekorrad: Täidavad lõike paralleelselt, kuid vastavalt lisamise järjekorrale.
  • Ülesanded (bloki): Töödüünused, mis saadetakse Dispatch järjekordadesse.
  • Dispatch allikad: Süsteemi sündmuste jälgimine (failid, soketid, signaalid), mis kutsuvad esile lõigu täitmise nende tekkimisel.

Kasutusvaldkonnad:

  1. Taustal toimingute täitmine: Andmete laadimine võrgust, piltide töötlemine, keerulised arvutused, et mitte blokeerida peamist niiti (UI).

    DispatchQueue.global(qos: .userInitiated).async {
        // Ressurssinõudliku operatsiooni täitmine
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // UI uuendamine peamisel niidil
            updateUI(with: processedData)
        }
    }
    
  2. Ülesannete planeerimine: Viivitusega või perioodiline täitmine.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // See kood täidetakse 2 sekundi pärast
        print("Viivitusega täitmine")
    }
    
  3. Andmetele juurdepääsu sünkroniseerimine: Kasutades serial järjekordi või DispatchQueue.concurrentPerform, et kontrollida paralleelset juurdepääsu.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Kasutades .barrier eksklusiivseks juurdepääsuks kirjutamisel
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Sünkroonne lugemine
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Eelised võrreldes käsitsi niitide haldamisega (POSIX niidid):

  • Lihtsam kasutamine: Kõrgema taseme abstraktsioon.
  • Tõhusus: GCD haldab süsteemipõhiste niitide poodi tõhusamalt, vähendades kulutusi.
  • Skaleeritavus: Automaatne kohandamine protsessorituumade arvuga.

QoS (Kvaliteedi tase): Määrab ülesande prioriteedi GCD planeerijale.

QoS Rakendus
userInteractive UI uuendused, animatsioonid, kiire reageerimine
userInitiated Kasutaja algatatud ülesanded, mis nõuavad kiiret lõpetamist (laadimine, piltide töötlemine)
default Vaikimisi prioriteet, vahepeal userInitiated ja utility
utility Pikalt täituvad ülesanded ilma kiirust nõudmata (laadimine, indekseerimine)
background Kasutajale nähtamatud ülesanded (varundamine, taustsünkronisatsioon)
unspecified Prioriteet määramata, määrab süsteem