ein ähnliches Beispiel Nach 39 hier in Frage: http://reactivex.io/learnrx/RXSwift - takeUntil Cancelling vor dem nächsten Ereignis
Ich versuche, ein Methodenaufruf in eine Folge dieser Anrufe zu transformieren. Sie erreichen dies durch Erstellen einer Variable
, die ich mit dem query
Wert jedes Mal aktualisieren die Methode aufgerufen wird.
Dann habe ich in meinem init()
:
_ = queryVariable.asObservable().flatMap({ query -> Observable<[JSON]> in
return self.facebookSearch(query).takeUntil(self.queryVariable.asObservable())
}).subscribeNext({ result in
if let name = result[0]["name"].string {
print(name)
} else {
print("problem")
}
})
Wenn ich tippe "ABC"
, wird meine Methode 3 mal mit "A"
, "ABC"
"AB"
, genannt werden. Das würde seq(["A", "AB", "ABC"])
mit queryVariable.asObservable()
zugeordnet werden. Dann mappe ich es auf Facebook-Suchen (Leute auf ihren Namen auf Facebook suchen). Und mit subscribeNext
drucke ich den Namen. Wenn ich nicht die takeUntil
verwende, funktioniert es wie erwartet, ich bekomme 3 Sätze von Ergebnissen, einen für jede meiner Abfragen ("A"
, "AB"
, "ABC"
).
Aber wenn ich schnell tippe (bevor Facebook Zeit hat, auf die Anfrage zu antworten), würde ich nur ein Ergebnis für die Abfrage wünschen "ABC"
. Deshalb habe ich die takeUntil
hinzugefügt. Damit würde ich erwarten, dass der facebookSearch(query: String)
Aufruf ignoriert wird, wenn der nächste query
hereinkommt, aber für die aktuelle Abfrage abgebrochen wird, so dass ich mit diesem takeUntil
nichts drucke.
Ist dies ein bekanntes Problem oder mache ich etwas falsch?
Aber ich annulliere nicht die gesamte Sequenz, ich benutze TakeUntil nur auf dieser bestimmten FacebookSearch. Genau wie Übung 39. Was ist der Unterschied hier? –
Wenn ich statt einer Variable auch PublishSubject verwende, funktioniert die TakeUtil wie ich beschrieben. Aber ich verstehe den Unterschied wirklich nicht. –
OK, ich habe mir Beispiel 39 angesehen. Ich füge den Unterschied zwischen dem Beispiel und Ihrem Code zu der Antwort hinzu. – joern