delay swift 4
¿Cómo cancelar DispatchQueue.main.asyncAfter(fecha límite: hora) en Swift3? (1)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cancelar un evento programado en Swift? 7 respuestas
Descripción:
Actualmente estoy usando el siguiente código para ver si el usuario ha dejado de escribir en la barra de búsqueda. Me gustaría cancelarlo cada vez que el usuario comience a escribir inmediatamente después de 0.5
segundos.
Código:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// your function here
}
Pregunta:
¿Cómo cancelo DispatchQueue.main.asyncAfter
si el usuario comienza a escribir de nuevo en Swift3
?
Lo que he intentado:
Anteriormente traté de implementar:
NSObject.cancelPreviousPerformRequests(withTarget: self)
self.perform(Selector(("searchForText:")), with: searchString, afterDelay: 0.5)
Sin embargo, el retraso no parece funcionar correctamente.
Más código:
//In class SearchViewController: UITableViewController, UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController) {
let searchString: String = searchController.searchBar.text!
//This is what I previously tried.. which doesn''t work...
//NSObject.cancelPreviousPerformRequests(withTarget: self)
//self.perform(Selector(("searchForText:")), with: searchString, afterDelay: 0.5)
//A struct with the first example code shown above.
Utils.Dispatch.delay(secondsToDelay: 1){
print("1 second has passed ! " + searchString)
}
}
Para aquellos que tienen tiempo para probar el código, publicaré mi solución actual que no está probada. Cuando tenga tiempo de probarlo, editaré la publicación.
private var operationQueue: OperationQueue!
private var mainAsyncQueue: DispatchQueue?
override func viewDidLoad() {
print("ViewDidLoad of SearchViewController called")
self.operationQueue = OperationQueue()
self.currentTime = DispatchTime.now()
}
// MARK: UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController) {
let searchStringRaw: String = searchController.searchBar.text!
let searchString = searchStringRaw.trimmingCharacters(in: .whitespacesAndNewlines)
guard searchString.characters.count > 0 else {
return
}
print("Search string: /(searchString)")
self.operationQueue.cancelAllOperations()
//Put this in Utils.Dispatch.Delay
self.mainAsyncQueue = DispatchQueue(label: "search.operation." + String(describing: DispatchTime.now()), qos: .default, attributes: DispatchQueue.Attributes.concurrent)
let time = DispatchTime.now()
self.currentTime = time
self.mainAsyncQueue!.asyncAfter(deadline: time + 1){
guard self.currentTime == time else {
return
}
let tempOperation = BlockOperation(block:{
if let nsurl: URL = Utils.Url.generate(Constants.Url.Search, options: "&p=1&n=20&q="+searchString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!){
//Download data and handle response
} else {
print("Something went wrong...")
}
})
self.operationQueue.addOperation(tempOperation)
}
}