Класс DispatchWorkItem является инкапсуляцией концепции рабочего элемента. Есть несколько преимуществ.
У рабочего элемента отправки есть флаг отмены. Если он отменен раньше
во время выполнения очередь отправки не выполнит ее и пропустит. Если оно
отменяется во время его выполнения, свойство cancel возвращает True. В
В этом случае мы можем прервать выполнение
Инкапсулируя наш код запроса в рабочем элементе, мы можем очень легко отменить его всякий раз, когда он заменяется новым, например:
class SearchViewController: UIViewController, UISearchBarDelegate {
// We keep track of the pending work item as a property
private var pendingRequestWorkItem: DispatchWorkItem?
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// Cancel the currently pending item
pendingRequestWorkItem?.cancel()
// Wrap our request in a work item
let requestWorkItem = DispatchWorkItem { [weak self] in
self?.resultsLoader.loadResults(forQuery: searchText)
}
// Save the new work item and execute it after 250 ms
pendingRequestWorkItem = requestWorkItem
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250),
execute: requestWorkItem)
}
}
В общем случае функции диспетчеризации могут принимать блок или DispatchWorkItem в качестве параметра. Таким образом, производительность не снизится, поскольку мы используем блоки в обоих случаях . Используйте тот, который подходит вам больше всего.