swift swift3 tvos

delay swift 4



¿Cómo cancelar DispatchQueue.main.asyncAfter(fecha límite: hora) en Swift3? (1)

Esta pregunta ya tiene una respuesta aquí:

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) } }