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 une requête au backend. P> J'ai essayé une implémentation de la debond trouvée ici Comment puis-je débattuer un appel de méthode? P> Mon problème : P> 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. P> 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. P> P>
3 Réponses :
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")
}
Pourquoi pas simplement utiliser planchedtitumerwithInterval ... code> mais oui, nstimer code> 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>
Le problème que vous rencontrez est que vous débarroniez la fonction Vous voulez seulement appeler FindUser code> 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é. débond code> une fois et stockez-le comme une propriété, comme: P> < Pré> xxx pré> p>
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) CODE> définir explicitement le type de retour semble résoudre , pas certain de pourquoi.