Sobes.tech
Junior

Kas ir GCD (Grand Central Dispatch) iOS izstrādes kontekstā?

sobes.tech AI

Atbilde no AI

GCD (Grand Central Dispatch) — tas ir Apple zema līmeņa API, kas paredzēts paralēlo operāciju un asinhronās koda izpildes pārvaldībai lietotnēs. Tas nodrošina mehānismu uzdevumu sūtīšanai izpildes rindās, kuras pārvalda sistēma.

Galvenās iezīmes:

  • Uzdevumu rindas (Dispatch Queues): FIFO struktūras, kurās tiek pievienoti koda bloki (closures) izpildei.
    • Izriet no to veidiem - paralēlas (concurrent) un secīgas (serial).
    • Nodrošina globālas sistēmas rindas un ļauj izveidot lietotāja rindas.
  • Bloki (Blocks): Darba vienības, kas tiek sūtītas rindās.
  • Līniju pārvaldība: Abstrakcija no tiešas pavedienu pārvaldības, ļaujot sistēmai optimāli sadalīt uzdevumus pieejamajos procesoru kodolos.
  • Prioritātes: Atļauj norādīt prioritāti uzdevumiem sistēmas globālajās paralēlajās rindās.

Rindu veidi:

  • Serial (secīgas): Izpilda uzdevumus stingri pēc kārtas, to pievienošanas secībā. Garantē, ka tikai viens uzdevums no šīs rindas tiek izpildīts vienlaikus.
    • Galvenā rinda (DispatchQueue.main) — īpaša serial rinda UI atjauninājumiem.
    • Lietotāja izveidotas serial rindas.
  • Concurrent (paralēlas): Var izpildīt vairākus uzdevumus vienlaikus, izpildes secība nav garantēta.
    • Sistēmas globālas paralēlas rindas ar dažādiem kvalitātes līmeņiem (Quality of Service - QoS).
    • Lietotāja izveidotas paralēlas rindas.

QoS līmeņi globālajām paralēlajām rindām:

QoS līmenis Apraksts Piemēri lietošanai
userInteractive Uzdevumi, ar kuriem aktīvi sadarbojas lietotājs. Animācijas, UI notikumu apstrāde.
userInitiated Uzdevumi, kurus uzsācis lietotājs, un kuriem nepieciešams tūlītējs rezultāts. Datu ielāde pēc pogas nospiešanas.
utility Ilgstoši izpildāmi uzdevumi, kas neprasa tūlītēju rezultātu. Datu ielāde, attēlu apstrāde fonā.
background Uzdevumi, kas notiek fonā, lietotājam neredzami. Kešatmiņas atjaunošana, datu sinhronizācija.
unspecified QoS līmenis nav norādīts, to nosaka sistēma. Vecā API vai zema līmeņa sistēmas uzdevumi.

Vienkāršs piemērs izmantošanai:

// Veikt uzdevumu fonā (globālā paralēlā rinda)
DispatchQueue.global(qos: .userInitiated).async {
    // Veikt ilgstošu operāciju
    print("Veic fonā uzdevumu")

    // Atgriezties galvenajā pavedienā UI atjaunināšanai
    DispatchQueue.main.async {
        print("Atjaunot UI galvenajā pavedienā")
    }
}

GCD atvieglo daudzpavedienu un paralēlās izpildes darbu, padarot kodu lasāmāku un mazāk pakļautu sacensības stāvokļa kļūdām, salīdzinot ar zema līmeņa pavedienu pārvaldību (piemēram, Thread).