6
votes

Rechercher comme vous tapez swift

J'essaie de mettre en œuvre la recherche lorsque vous tapez écrit à Swift. Cela fonctionne déjà mais j'ai besoin d'un réglage. J'envoie avec chaque lettre dactylée dans xxx

une requête au backend. xxx

J'ai essayé une implémentation de la debond trouvée ici Comment puis-je débattuer un appel de méthode?

Mon problème :

Je veux "redémarrer" un appel de méthode s'il a été déclenché dans un certain temps. Alors exagérons un peu un peu.

La demande doit seulement démarrer après que le texte de recherche n'était pas saisi pendant 2 secondes. Donc, si je suis un tonnet rapide et que vous tapez chaque 0,5 seconde, une lettre ne doit jamais être déclenchée sauf i Pause pendant au moins 2 secondes.


0 commentaires

3 Réponses :


8
votes

Vous pouvez utiliser un NSTIMER. Démarrez ou invalidez et redémarrez la minuterie pendant 2 secondes dans votre TextDidChange. Demandez à la minuterie enflammer la méthode FindUser lorsqu'elle apparaît réellement.

    var debounceTimer: NSTimer?

@IBAction func test() {
    if let timer = debounceTimer {
        timer.invalidate()
    }
    debounceTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("getUser"), userInfo: nil, repeats: false)
    NSRunLoop.currentRunLoop().addTimer(debounceTimer!, forMode: "NSDefaultRunLoopMode")
}

func getUser() {
    println("yeah")
}


1 commentaires

Pourquoi pas simplement utiliser planchedtitumerwithInterval ... mais oui, nstimer est un moyen beaucoup plus facile de mettre en œuvre depuis que vous pouvez annuler une minuterie mais ne peut pas annuler DisPatch_After < / code>



1
votes

Le problème que vous rencontrez est que vous débarroniez la fonction FindUser avant de l'appeler à chaque fois. Votre fonction de déboboration définit la minuterie initiale et le délai, mais comme vous l'appelez à chaque fois, la minuterie initiale est toujours «maintenant». Vous devez débutant une fois que la fermeture peut maintenir son temps de dernière exécution capturé.

Vous voulez seulement appeler débond une fois et stockez-le comme une propriété, comme: < Pré> xxx


2 commentaires

Merci pour la réponse Nate Cook. J'ai résolu mon problème avec la solution de Jeremy, mais je ne suis probablement pas capable de mettre en œuvre la vôtre. ^^ Si j'initialise le variateur paresseux, alors je reçois un problème de nom de membre "FindUser". C'est probablement une sorte de problème d'instance ...


Pour contourner la variable auto-définie, vous pouvez utiliser paresseux varèfduserfinduser: () -> () = () = (2,0, DISPATCH_GET_MAIN_QUEUE (), Self.FindUser) définir explicitement le type de retour semble résoudre , pas certain de pourquoi.



0
votes

la seule chose dont vous avez besoin est de créer une minuterie xxx


0 commentaires