Что такое DispatchWorkItem и для чего он используется?

«Что такое DispatchWorkItem и для чего он используется?» — вопрос из категории Многопоточность, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DispatchWorkItem — это объектная обертка над замыканием (closure) в GCD, предоставляющая расширенный контроль над выполнением задачи: отмену, задержку, уведомление о завершении.

Ключевые возможности:

  • Отмена задачи: Метод cancel(). Отмененная задача не будет запущена, а если уже выполняется, может проверить свойство isCancelled.
  • Задержка выполнения: Используется с DispatchQueue.asyncAfter.
  • Синхронный запуск: Метод perform() для немедленного выполнения в текущем потоке.
  • Уведомления: Можно установить обработчик завершения через notify(queue:execute:).

Примеры использования:

1. Отмена отложенной задачи (поиск с debounce):

class SearchManager {
    private var pendingSearchWorkItem: DispatchWorkItem?

    func performSearch(query: String) {
        // Отменяем предыдущий отложенный поиск
        pendingSearchWorkItem?.cancel()

        let newWorkItem = DispatchWorkItem { [weak self] in
            self?.executeSearch(query: query)
        }
        pendingSearchWorkItem = newWorkItem

        // Запускаем новый поиск через 0.3 секунды
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: newWorkItem)
    }
}

2. Зависимости и уведомления:

let backgroundWorkItem = DispatchWorkItem { /* Тяжелая задача */ }
let completionWorkItem = DispatchWorkItem { print("Завершено") }

// Запустить completionWorkItem после backgroundWorkItem
backgroundWorkItem.notify(queue: .main, execute: completionWorkItem)

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

Преимущество перед простым замыканием: DispatchWorkItem инкапсулирует состояние и логику управления жизненным циклом задачи.