Sobes.tech
Middle

Grand Central Dispatch (GCD) ичинде кайсы инструменттер бар?

sobes.tech AI

AIден жооп

GCDтин негизги аспаптары:

  • Диспетчердик кезектер (Dispatch Queues): Коддун блокторун аткарууну башкаруу. Алар болушу мүмкүн:
    • Тизмектүү (Serial): Иштерди бирден аткарат, тартибин камсыз кылуу үчүн.
    • Көптөгөн (Concurrent): Иштерди бир убакта аткарат (жарактуу системдик ресурстар чегинде).
  • Глобалдык көптөгөн кезектер (Global Concurrent Queues): Жүйө тарабынан берилет, алдын ала аныкталган артыкчылыктарга ээ (QoS).
  • Негизги кезек (Main Queue): Специальдүү тизмектүү кезек, колдонмонун негизги агымына байланыштуу. UI менен иштөө үчүн колдонулат.
  • Диспетчердик топтор (Dispatch Groups): Асинхрондук иштердин бүтүшүн көзөмөлдөөгө мүмкүндүк берет.
  • Барьер семантикасы (Barrier Semantics): Көптөгөн кезектер үчүн, "барьер" түзүүгө мүмкүндүк берет, ал барьерден кийин гана иштер аткарылат, ал барьер өтүлгөнчө.
  • Диспетчердик булактары (Dispatch Sources): Системдик окуяларга жооп кайтарууга мүмкүндүк берет (файл операциялары, сигналдар, таймерлер жана башка).
  • DispatchWorkItem: Код блокун камтыйт жана кезекке жөнөтүлүшү, жокко чыгарылышы жана аяктоо жөнүндө кабардар болушу мүмкүн.

Түзүү мисалы — тизмектүү кезек түзүү жана ишти аткаруу:

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

serialQueue.async {
    // Асинхрон түрдө аткарылат
    print("Иш тизмектүү кезекте аткарылды")
}

Диспетчердик топту колдонуу мисалы:

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

group.enter() // Топко кирүү
concurrentQueue.async {
    // Иш 1
    print("Иш 1 аяктады")
    group.leave() // Топтон чыгуу
}

group.enter() // Топко кирүү
concurrentQueue.async {
    // Иш 2
    print("Иш 2 аяктады")
    group.leave() // Топтон чыгуу
}

group.notify(queue: .main) {
    // Бардык иштер аяктагандан кийин ишке ашырылат
    print("Бардык иштер топто аяктады")
}

DispatchWorkItem колдонуу мисалы:

let workItem = DispatchWorkItem {
    print("WorkItem аткарылды")
}

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

// workItem.cancel() // Аны аткаруудан мурун жокко чыгарыш мүмкүн