web-dev-qa-db-fra.com

Comment annuler DispatchQueue.main.asyncAfter (délai: heure) dans Swift3?

La description:

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
}

Question:

Comment annuler DispatchQueue.main.asyncAfter si l'utilisateur recommence à taper Swift3?

Ce que j'ai essayé:

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)
    }
}
18
kemicofa ghost

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

}
3
kemicofa ghost