J'utilise actuellement le code suivant pour voir si l'utilisateur a cessé de taper dans la barre de recherche. Je voudrais l'annuler chaque fois que l'utilisateur commence immédiatement à taper après 0.5
secondes.
Code:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// your function here
}
Comment annuler DispatchQueue.main.asyncAfter
si l'utilisateur recommence à taper Swift3
?
J'ai déjà essayé d'implémenter:
NSObject.cancelPreviousPerformRequests(withTarget: self)
self.perform(Selector(("searchForText:")), with: searchString, afterDelay: 0.5)
Cependant, le retard ne semble pas fonctionner correctement.
Plus de code:
//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)
}
}
Pour ceux qui ont le temps de tester le code, je posterai ma solution actuelle qui n'a pas été testée. Lorsque j'aurai le temps de l'essayer, je modifierai le message.
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)
}
}