Je suis plutôt nouveau à RxSwift et essaye de gérer la tâche de basculer entre l'état vide et l'état peuplé d'une saisie semi-automatique de recherche.Comment utiliser correctement switchLatest pour basculer entre les résultats de recherche et l'état vide de tableview?
J'ai un pilote qui répond à un texte textfield change avec longueur> 0 et fait des demandes de réseau et un autre que des filtres sur les requêtes de recherche vides et peupler la tableview avec "Favoris". J'ai d'abord utilisé merge() sur les deux observables mais le problème était que l'effacement rapide du texte montrerait les favoris mais quand la dernière requête de récupération reviendrait, elle fusionnerait et écraserait l'état vide.
J'ai essayé de passer à switchLatest() en espérant qu'il annulerait la requête de récupération précédente quand le dernier clearResult a été déclenché mais cette observable ne semble jamais se déclencher et je suis un peu coincé. Toute aide serait grandement appréciée!
let queryFetchResultViewModel: Driver<[NewSearchResultViewModel]> = queryText
.filter { $0.utf8.count > 0 }
.throttle(0.5, scheduler: MainScheduler.instance)
.flatMapLatest { query in
appContext.placeStore.fetchPredictions(withQuery: query)
}
.map { $0.map { NewSearchResultViewModel.prediction(prediction: $0) } }
.asDriver(onErrorJustReturn: [])
let queryClearResultViewModel: Driver<[NewSearchResultViewModel]> = queryText
.filter { $0.utf8.count == 0 }
.withLatestFrom(favoritePlaces.asObservable())
.map { places in places.map(NewSearchResultViewModel.place) }
.asDriver(onErrorJustReturn: [])
searchResultViewModel = Driver.of(queryFetchResultViewModel, queryClearResultViewModel).switchLatest()
Pourquoi ne pas vous résoudre le problème initial avec 'fusion()'? Effacer rapidement le texte devrait annuler votre demande précédente. Et c'est une tâche facile – iWheelBuy
Aussi, pourquoi étrangler, pas rebondir? – iWheelBuy
@iWheelBuy J'ai d'abord essayé de fusionner mais je ne voyais pas le comportement "annuler la requête précédente" que vous avez décrit. Étant donné que la demande avec une demande réseau prend plus de temps que la charge immédiate des lieux favoris, elle reviendrait plus tard et écraserait l'événement de lieu favori. Je ne crois pas que le flux avec une demande de réseau fusionne réellement dans son événement jusqu'à ce qu'il revienne donc il n'y a rien à annuler pour le moment (du point de vue du flux fusionné). Cela a-t-il du sens? – Danny