Sobes.tech
Middle

Kādi rīki ir pieejami Grand Central Dispatch (GCD)?

sobes.tech AI

Atbilde no AI

Galvenie GCD rīki:

  • Dispečera rindas (Dispatch Queues): Kontrolē koda bloku izpildi. Tās var būt:
    • Sekvencē (Serial): izpilda uzdevumus pa vienam, nodrošinot kārtību.
    • Paralēlas (Concurrent): izpilda uzdevumus vienlaikus (ierobežojot pieejamos sistēmas resursus).
  • Globālās paralēlās rindas (Global Concurrent Queues): Sistēmas nodrošinātas, ar iepriekš noteiktiem prioritātes līmeņiem (QoS).
  • Galvenā rinda (Main Queue): Īpaša sekvencēta rinda, kas ir saistīta ar galveno pavedienu. To izmanto UI darbam.
  • Dispečera grupas (Dispatch Groups): Ļauj uzraudzīt asinhrono uzdevumu pabeigšanu.
  • Barjeru semantika (Barrier Semantics): Paralēlām rindām, ļauj izveidot "barjeru", pēc kuras tiek izpildīti tikai uzdevumi, kas ir pēc barjeras, kamēr barjera nav pārvarēta.
  • Dispečera avoti (Dispatch Sources): Ļauj reaģēt uz sistēmas notikumiem (failu operācijas, signāli, taimeri utt.).
  • DispatchWorkItem: Ietver koda bloku un to var nosūtīt rindā, atcelt un saņemt paziņojumu par pabeigšanu.

Piemērs, kā izveidot sekvencētu rindu un izpildīt uzdevumu:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Izpildās asinhroni sekvencē
    print("Uzdevums izpildīts sekvencē")
}

Piemērs, kā izmantot dispečera grupu:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Ieeja grupā
concurrentQueue.async {
    // Uzdevums 1
    print("Uzdevums 1 pabeigts")
    group.leave() // Iziet no grupas
}

group.enter() // Ieeja grupā
concurrentQueue.async {
    // Uzdevums 2
    print("Uzdevums 2 pabeigts")
    group.leave() // Iziet no grupas
}

group.notify(queue: .main) {
    // Izpildās pēc visu uzdevumu pabeigšanas
    print("Visi uzdevumi grupā pabeigti")
}

Piemērs, kā izmantot DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem izpildīts")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Var atcelt pirms izpildes