Ответ
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 инкапсулирует состояние и логику управления жизненным циклом задачи.