Sobes.tech
Junior

Mis on GCD (Grand Central Dispatch) iOS arenduse kontekstis?

sobes.tech AI

Vastus AI-lt

GCD (Grand Central Dispatch) on Apple madal-tasandme API, mis võimaldab hallata paralleelset tööd ja asünkroonset koodi täitmist rakendustes. See pakub mehhanismi ülesannete saatmiseks täitmise järjekordades, mida haldab süsteem.

Peamised omadused:

  • Täitmise järjekorrad (Dispatch Queues): FIFO struktuurid, kuhu lisatakse koodiplokid (closures) täitmiseks.
    • Tüüpideks on concurrent (paralleelne) ja serial (järjepidev).
    • Pakuvad globaalseid süsteemijärjekordi ning võimaldavad luua kasutajaomaseid.
  • Blokid (Blocks): Töödüünid, mis saadetakse järjekordadesse.
  • Lõimede juhtimine: Abstraktsioon otse lõimede juhtimisest, võimaldades süsteemil optimaalselt jaotada ülesandeid saadaval olevatele protsessorituumadele.
  • Prioriteedid: Võimaldab määrata prioriteeti ülesannetele süsteemi globaalsetes concurrent järjekordades.

Järjekordade tüübid:

  • Serial (järjepidevad): Täidab ülesandeid rangelt järjekorras, milles need lisati. Tagab, et ükski ülesanne sellest järjekorrast ei täideta samaaegselt.
    • Peamine järjekord (DispatchQueue.main) — spetsiaalne serial järjekord UI uuendusteks.
    • Kasutajaomased serial järjekorrad.
  • Concurrent (paralleelsed): Võivad täita mitut ülesannet samaaegselt, täitmise järjekord ei ole garanteeritud.
    • Süsteemi globaalne paralleelne järjekord erinevate teenindustasemete (QoS) abil.
    • Kasutajaomased paralleelsed järjekorrad.

QoS tasemed globaalsetele concurrent järjekordadele:

QoS tase Kirjeldus Näited kasutusest
userInteractive Ülesanded, millega aktiivselt suhtleb kasutaja. Animatsioonid, UI sündmuste töötlemine.
userInitiated Kasutaja algatatud ülesanded, millele on vaja kohest tulemust. Sisu laadimine nupuvajutusega.
utility Pikaajalised ülesanded, mis ei nõua kohest tulemust. Andmete laadimine, piltide töötlemine taustal.
background Taustal toimuvad ülesanded, kasutajale nähtamatud. Vahemälu uuendamine, andmete sünkroniseerimine.
unspecified QoS tase määramata, määrab selle süsteem ise. Vanem API või madala taseme süsteemsed ülesanded.

Lihtne näide kasutusest:

// Teha ülesanne taustal (globaalne concurrent järjekord)
DispatchQueue.global(qos: .userInitiated).async {
    // Teha pikaajalist operatsiooni
    print("Teostatakse taustatööd")

    // Tagasi peamisele lõimile UI uuendamiseks
    DispatchQueue.main.async {
        print("Uuendame UI-d peamisel lõimel")
    }
}

GCD lihtsustab mitmetöötlust ja paralleelset täitmist, muutes koodi loetavamaks ja vähem haavatavaks rassiolukorra vigadele võrreldes madala taseme lõimede juhtimisega (näiteks Thread).