Назад к вопросам
Middle
126
questionbank

Какие способы существуют для размещения задач в очереди Grand Central Dispatch (GCD)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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()