2016-08-24 1 views
1

Je suis en train d'implémenter un champ de recherche en utilisant ReactiveCocoa 4, et je veux seulement frapper l'API de recherche après qu'aucun texte n'a été entré pendant X temps. Je l'ai fait précédemment en annulant précédemment planifié et en tirant un sélecteur "executeSearch" dans la méthode déléguée textDidChange. Cela garantit qu'à chaque fois que je tape, tout sélecteur "executeSearch" précédemment planifié est annulé et un nouveau est programmé pour se déclencher dans X secondes. Je veux maintenant faire ce même comportement, mais à partir d'un producteur de signal lié à mon texte d'entrée. Ma mise en œuvre actuelle est proche, mais pas la même chose. Ce comportement limite simplement l'événement d'entrée de texte à uniquement déclencher toutes les 0,5 secondes au lieu d'annuler l'événement précédent.ReactiveCocoa 4 - Retarder et filtrer les événements de signal

searchTextInput.producer.delay(0.3, onScheduler: RACScheduler.currentScheduler()) 
         .throttle(0.5, onScheduler: RACScheduler.currentScheduler()) 
         .producer.startWithNext({ [unowned self] searchText in 
          self.executeSearch(searchText) 
         }) 

Je vais avoir du mal à passer au crible la documentation ReactiveCocoa 4 pour savoir quelles fonctions signal I devrais utiliser! Je vous remercie!

Répondre

1

Vous devez utiliser DateSchedulerType. Par exemple:

textField.rac_textSignal() 
      .toSignalProducer() 
      .map { $0 as! String } 
      .flatMapError { _ in SignalProducer<String, NoError>.empty } 
      .throttle(2.0, onScheduler: QueueScheduler.mainQueueScheduler) 
      .filter { $0.isEmpty } 
      .startWithNext { text in 
       print("t: \(text)") 
     } 

vous pouvez également écrire votre executeSearch comme SignalProducer et utiliser flatMap (.Latest) pour créer des chaînes de signal.

Et ne pas oublier d'utiliser mainQueueSheduler pour obtenir le résultat à l'interface utilisateur