GOOGLE ADS

Donnerstag, 14. April 2022

Wie kann ich Daten aus anderen Flow-Daten im Flow verwenden? (Kotlin-Fluss)

Ich habe den Code wie folgt geschrieben.

suspend fun getDataByRegion(): Flow<Result?> {
// getRegion() return Flow<Region>
return getRegion().map { region: Region ->
repository.requestDataFromServer(region)
}
}

Das Problem ist, dass repository.requestDataFromServer(region) zweimal aufgerufen wird.

Also denke ich, ich sollte Operatoren wie zipoder verwenden combine.

Wie kann bei Verwendung dieser Operatoren der zweite Flow die Daten des ersten Flows verwenden?


Lösung des Problems

Bei den Operatoren combineund zipkönnen Sie sich nicht auf das Ergebnis des anderen verlassen. Im Allgemeinen ist Ihr Verkettungsansatz mapalso in Ordnung.

Sie haben mehrere Möglichkeiten:


  • Angenommen, Ihre Repository-Methode wird nirgendwo anders aufgerufen, liegt der Grund für den zweimaligen Aufruf darin, dass die Region Flowzweimal emittiert. Versuchen Sie also herauszufinden, warum dies der Fall ist.

    Wie auch immer, wenn Ihre Regionsmethode Flowdieselbe Region zweimal zurückgibt, können Sie sie beheben, indem Sie einfach
    .distinctUntilChanged()nachher hinzufügen getRegion():

    getRegion().distinctUntilChanged().map { region: Region ->
    repository.requestDataFromServer(region)
    }

    Dadurch wird sichergestellt, dass Ihre Region Flownicht redundant mit denselben Daten emittiert. Alternativ distinctUntilChanged()direkt zur Repository-Methode hinzufügen, wenn dies immer das erwartete Verhalten ist.


  • Fragen Sie sich, ob diese Methode wirklich einen Stream zurückgeben muss ( Flow). Ich schätze, Sie brauchen einen Stream, da sich die Region zur Laufzeit ändern kann und Sie möchten, dass etwas in Ihrer App automatisch aktualisiert wird? Aber wenn nicht, könnten Sie den Stream einfach in ein einzelnes Ergebnis konvertieren:

    val region = getRegion().first()
    repository.requestDataFromServer(region)


Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...