Sobes.tech
Junior

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

sobes.tech AI

Vastus AI-lt

GCD (Grand Central Dispatch) on Apple'i loodud madala taseme paralleelprotsessimise tehnoloogia, mis põhineb C-l ning millel on mugavad Swift ja Objective-C ümbrised. See pakub mehhanismi tööelementide (work items) järjekordade haldamiseks ning nende asünkroonseks või sünkroonseks täitmiseks kättesaadavates protsessorituumades:

GCD põhiprincipid:

  1. Dispatch Queues: Tööjärjekorrad. On kahte tüüpi:

    • Serial Queues: Tööde täitmine järjekorras. See aitab vältida konkurentsitingimusi jagatud ressurssidele juurdepääsul.
    • Concurrent Queues: Tööde täitmine samaaegselt (kuid nende algus- ja lõppjärjestus ei ole garanteeritud). Kasutatakse sõltumatute tööde jaoks, mis võivad toimuda samaaegselt.
    • Main Queue: Spetsiaalne järjekord, mis on seotud peamise vooluga. Kasutatakse UI uuendamiseks. Kõik UI-ga seotud tööd peavad toimuma just selles järjekorras.
  2. Work Items (Closures/Blocks): Koodiplokid, mis esindavad eraldi tööd.

  3. Dispatch Group: Võimaldab ühendada töögruppe ning saada teavitust, kui kõik tööd on lõpetatud.

  4. Dispatch Semaphores: Sünkroniseerimise primitiivid, mis haldavad piiratud ressurssidele juurdepääsu.

iOS arenduses kasutamine:

  • Raskete operatsioonide täitmine taustal: Näiteks võrgupäringud, piltide töötlemine, andmebaasidega töötamine — ülesannete teisaldamine main queue-st taustajärjekordadesse (näiteks globaalsetesse konkurentsijärjekordadesse), et vältida UI lukustumist.

    // Asünkroonne ülesande täitmine globaalsetes paralleelsetes järjekordades
    DispatchQueue.global(qos: .userInitiated).async {
        // Raskem operatsioon
        let result = performHeavyOperation()
    
        // UI uuendamine peamisel voolul
        DispatchQueue.main.sync {
            updateUI(with: result)
        }
    }
    
  • UI uuendamine: Kõik kasutajaliidese muudatused peavad toimuma main queue-s.

    // UI uuendamine peamisel voolul
    DispatchQueue.main.async {
        self.label.text = "Uuendatud!"
    }
    
  • Andmete juurdepääsu sünkroniseerimine: Kasutades kasutaja spetsiifilisi järjekordi, et hallata jagatud andmetele juurdepääsu sünkroonselt.

    // Näide sünkroonitud juurdepääsust serial järjekorras
    let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess")
    
    func updateSharedData(newValue: Int) {
        dataAccessQueue.async {
            // Turvaliselt muuda jagatud andmeid
            sharedData = newValue
        }
    }
    
  • Tööde grupeerimine: Oodata mitme asünkroonse töö lõpetamist enne järgmise sammu jätkamist.

    // Tööde grupp
    let group = DispatchGroup()
    
    group.enter() // Alusta tööd 1
    performAsyncOperation1 {
        print("Töö 1 lõpetatud")
        group.leave()
    }
    
    group.enter() // Alusta tööd 2
    performAsyncOperation2 {
        print("Töö 2 lõpetatud")
        group.leave()
    }
    
    // Teavitus, kui kõik tööd on lõpetatud
    group.notify(queue: .main) {
        print("Kõik tööd lõpetatud, uuendame UI")
        // UI uuendamine
    }
    
  • Hilinenud täitmine: Koodi täitmine kindla aja pärast.

    // Hilinenud täitmine 2 sekundit
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("Käivitatud 2 sekundiga")
    }
    

GCD pakub kõrgema taseme ja tõhusama lähenemise voogude haldamiseks võrreldes traditsiooniliste voogudega (näiteks Thread), usaldades voogude puli süsteemile ning võimaldades tõhusalt kasutada mitme tuumaga protsessoreid.