Sobes.tech
Middle

Mida te saate rääkida Grand Central Dispatch-ist ja selle kasutamisest iOS arenduses?

sobes.tech AI

Vastus AI-lt

Grand Central Dispatch (GCD) — see on madala taseme API, mis põhineb asünkroonse ülesannete täitmise kontseptsioonil mitme tuumaga protsessorite jaoks. See pakub saatjate järjekordi, mida haldab süsteem, vabastades arendaja käsitsi lõimede loomise ja haldamise eest:

Peamised komponendid:

  • Saatjate järjekorrad (Dispatch Queues): Andmestruktuurid, mis hoiavad tööblokke (workItem) täitmiseks. Ülesanded täidetakse lisamise järjekorras:

    • Süntesaatorid (Serial Queues): Täidavad ülesandeid üks korraga, järjekorras. Tagavad täitmise järjekorra ja andmete turvalisuse, mis muudetakse ainult ühes järjekorras:
    • Paralleelsed järjekorrad (Concurrent Queues): Täidavad ülesandeid paralleelselt, kasutades saadaval olevaid süsteemi ressursse. Täitmise järjekord ei ole garanteeritud:
      • Globaalsed paralleelsed järjekorrad (Global Concurrent Queues): Pakub süsteem erinevate prioriteetidega (qos): .userInteractive, .userInitiated, .default, .utility, .background:
    • Peajärjekord (Main Queue): Spetsiaalne süntesaator, seotud rakenduse põhilooga (main thread). Kasutatakse UI uuendamiseks:
  • Tööblokid (Work Items): sulgud (closures) või funktsioonid, mida GCD saadab täitmiseks:

  • Saatjate grupid (Dispatch Groups): võimaldavad täita ülesandeid mitmel järjekorral ja saada teate kõigi ülesannete lõpetamisest grupis:

  • Saatjate semaforid (Dispatch Semaphores): mehhanism, mis piirab samaaegselt ressursile pöörduvate lõimede arvu või sünkroniseerib lõimede vahel:

iOS arenduses kasutamine:

  • Asünkroonne ülesannete täitmine: ressurssinõudlike operatsioonide (võrgu päringud, andmebaasi töö, piltide töötlemine) üleviimine põhiloost, et säilitada UI reageerimisvõime:
    let queue = DispatchQueue.global(qos: .userInitiated)
    queue.async {
        // Ressursinõudliku operatsiooni täitmine
        let result = performHeavyCalculation()
    
        DispatchQueue.main.async {
            // UI uuendamine põhiloos
            self.updateUI(with: result)
        }
    }
    
  • Sünkroniseerimine:
    • Semaforite kasutamine, et piirata juurdepääsu jagatud ressurssidele:
      let semaphore = DispatchSemaphore(value: 1) // lubab 1 lõimel pääseda
      semaphore.wait() // ootab, kuni semafor muutub kättesaadavaks
      // Juurdepääs jagatud ressursile
      semaphore.signal() // vabastab semafori
      
    • Süntesaatorid tagavad andmete turvalisuse:
  • Grupipõhine ülesannete täitmine: mitme asünkroonse ülesande täitmine ja nende lõpetamise ootamine:
    let group = DispatchGroup()
    let concurrentQueue = DispatchQueue.global()
    
    group.enter() // grupi sisenemine
    concurrentQueue.async {
        // Ülesanne 1
        print("Ülesanne 1 lõpetatud")
        group.leave() // grupist väljumine
    }
    
    group.enter()
    concurrentQueue.async {
        // Ülesanne 2
        print("Ülesanne 2 lõpetatud")
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Kõik ülesanded grupis lõpetatud
        print("Kõik ülesanded lõpetatud")
    }
    
  • Viivitusega täitmine: koodi täitmine kindla aja pärast:
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Kood täidetakse 2 sekundi pärast
        print("Viivitusega täitmine")
    }
    

GCD eelised:

  • Lihtne kasutada võrreldes käsitsi lõimede haldamisega:
  • Süsteemi haldama hallatud lõimede pult, optimeeritud mitme tuumaga protsessoritele:
  • Ressursside tõhus kasutamine:
  • Vältida probleeme, mis on seotud käsitsi lõimede haldamisega (võistlusolukorrad, vastastikune blokeerimine):

GCD puudused:

  • Vähem paindlik kui käsitsi juhtimine mõnes keerulisemas stsenaariumis:
  • Mitme lõimuga koodi silumine võib olla keeruline.