Фон
Я выполняю поиск.Каждый поисковый запрос приводит к одному DispatchWorkItem, который затем ставится в очередь для выполнения.Поскольку пользователь может инициировать новый поиск быстрее, чем можно завершить предыдущий, я бы хотел отменить предыдущий, как только получу новый.
Это мои текущие настройки:
var currentSearchJob: DispatchWorkItem?
let searchJobQueue = DispatchQueue(label: QUEUE_KEY)
func updateSearchResults(for searchController: UISearchController) {
let queryString = searchController.searchBar.text?.lowercased() ?? ""
// if there is already an (older) search job running, cancel it
currentSearchJob?.cancel()
// create a new search job
currentSearchJob = DispatchWorkItem() {
self.filter(queryString: queryString)
}
// start the new job
searchJobQueue.async(execute: currentSearchJob!)
}
Проблема
Я понимаю, что dispatchWorkItem.cancel()
не убивает запущенную задачу немедленно.Вместо этого мне нужно проверить dispatchWorkItem.isCancelled
вручную.Но как мне получить правильный dispatchWorkItem
объект в этом случае?
Если бы я устанавливал currentSearchJob
только один раз, я мог бы просто получить доступ к этому атрибуту, как в случае с в этом случае .Однако это здесь не применимо, поскольку атрибут будет переопределен до завершения метода filter()
. Как узнать, какой экземпляр действительно выполняет код, в котором я хочу проверить dispatchWorkItem.isCancelled
?
В идеале я хотел бы предоставить недавно созданный DispatchWorkItem
какдополнительный параметр к методу filter()
.Но это невозможно, потому что я получу ошибку Variable used within its own initial value
.
Я новичок в Swift, поэтому я надеюсь, что просто что-то упустил.Любая помощь очень ценится!