Sobes.tech
Middle

papasakokite apie bendrą eilę „iOS“ daugiasraigtiniame programavime.

sobes.tech AI

Atsakymas iš AI

Globalus eilė (Global Queue) Grand Central Dispatch (GCD) yra iš anksto apibrėžtos sistemos eilės, kurios yra prieinamos visoms programėlėms. Jos yra Concurrent Queues, tai yra, užduotys jose gali būti vykdomos lygiagrečiai skirtinguose srautuose.

Pagrindinės savybės:

  • Tipai: Skiriasi pagal paslaugos kokybės lygį (QoS - Quality of Service).
  • QoS: Nustato užduočių vykdymo prioritetą, įtakoja, kurios užduotys turi būti atliktos greičiau.
  • Lygiagretumas: Leidžia vienu metu vykdyti daugybę užduočių.
  • Sisteminės: Sukuriamos ir valdomos operacinės sistemos.

Globalių eilės tipai (nuo aukščiausio iki žemiausio prioriteto):

QoS lygis Aprašymas
userInteractive Užduotys, tiesiogiai veikiančios naudotojo sąsają (animacijos, įvykiai).
userInitiated Užduotys, kurias inicijuoja naudotojas, bet neblokuoja UI (turinio įkėlimas).
default Numatytoji lygio be aiškaus QoS nurodymo.
utility Užduotys, reikalaujančios vykdymo laiko, bet nėra skubios UI atžvilgiu (didelio failo įkėlimas).
background Užduotys, vykdomos fone, nematomos naudotojui (duomenų sinchronizavimas).
unspecified Retai naudojama, kai QoS nėra svarbus. Lygiavertė su default.

Prieigos prie globalių eilės:

// Gauti globalią eilę su nurodytu QoS lygiu
let userInitiatedQueue = DispatchQueue.global(qos: .userInitiated)

// Gauti numatytąją globalią eilę
let defaultQueue = DispatchQueue.global()

Naudojimas globalių eilių užduotims vykdyti:

// Asinchroninis užduoties vykdymas fone
DispatchQueue.global(qos: .background).async {
    // Ilgai trunkantis kodas, kuris neblokuoja UI
}

// Sinchroninis užduoties vykdymas (mažiau paplitęs globalių eilių atveju)
DispatchQueue.global(qos: .userInitiated).sync {
    // Kodas, kuris turi būti įvykdytas prieš tęsiant dabartinį srautą
}

Svarbu prisiminti:

  • Nerekomenduojama vykdyti užduočių, tiesiogiai veikiančių naudotojo sąsają, globaliose eilėse (išskyrus userInteractive labai greitoms operacijoms). UI atnaujinimus atlikite pagrindinėje eilėje (DispatchQueue.main).
  • Globalios eilės skirtos lygiagrečiam vykdymui. Užduočių vykdymo tvarka gali būti ne garantuota.
  • Naudojant sync globalioje eilėje, dabartinis srautas bus užblokuotas iki užduoties pabaigos. Tai gali sukelti UI užšalimą, jei kviečiama iš pagrindinio srauto.