Sobes.tech
Middle

Какви методи съществуват за поставяне на задачи в опашката на Grand Central Dispatch (GCD)?

sobes.tech AI

Отговор от AI

Следните са начините за поставяне на задачи в опашката GCD:

  1. Асинхронно изпълнение (async): Задачата се добавя към опашката и изпълнението продължава веднага в текущия поток, без да се чака завършването на задачата в опашката.

    DispatchQueue.global().async {
        // Код на задачата
    }
    
  2. Синхронно изпълнение (sync): Задачата се добавя към опашката и текущият поток се блокира, докато задачата не приключи. Избягвайте използването на sync на главния поток за дълги задачи, за да не блокирате UI-то.

    DispatchQueue.global().sync {
        // Код на задачата, текущият поток ще чака
    }
    
  3. Отложено изпълнение (asyncAfter): Задачата се добавя към опашката с посочена закъснение. Изпълнението ще започне не по-рано от посоченото време.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // Код на задачата ще се изпълни след 2 секунди
    }
    
  4. Изпълнение в група (DispatchGroup): Задачите могат да бъдат добавени към DispatchGroup за синхронизиране на тяхното завършване. Може да се изчака завършването им или да се получи известие (notify) след тяхното завършване.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Задача 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Задача 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Всички задачи в групата са завършили
    }
    
  5. Изпълнение на итерации (concurrentPerform): Позволява да се изпълни даден блок код iterations пъти паралелно на конкурентна опашка.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Код, изпълняващ се за всеки индекс паралелно
    }
    
  6. DispatchWorkItem: Обгръща блок код и позволява да се отменя задачата преди или след добавянето й към опашката, ако все още не е започнала.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Код на задачата
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Може да се отменя задачата, ако все още не е започнала
    // workItem?.cancel()