創建新流程的最佳實踐是什么?例如:我有一些代碼
viewModelScope.launch(dispatchers.io) {
method1().collect {
method2().collect{}
}
}
fun method1(): Flow
fun method2(): Flow
在我看來,從收集操作開始新流程是不正確的。但我無法證實這一點。或者我錯了,它允許操作
uj5u.com熱心網友回復:
澄清:“創建”流與“執行/啟動”流不同。
您可以使用 Flow Builder 創建/構建 Flow。由于您的兩個方法回傳 Flows,這是您構建它們的地方。
流構建器的一些示例是:
flowOf():從給定的專案集創建流。asFlow(): 將集合轉換為流的擴展函式。flow{}:自定義流構建器塊來實作任何自定義業務邏輯,以通過使用emit().
對于簡單的“靜態”流構建器,例如flowOf(1, 2, 3),您可以將 Flow 定義為屬性以減少開銷,而對于帶有引數的更復雜的構建器函式,即使用時flow{},方法是要走的路,就像在您的示例中一樣。
Flow 是一個冷流,這意味著您的構建器代碼在收集之前不會被執行。
collect{}是“開始”流程執行的正確方法。你實際上是在一個一個地收集它的專案,執行它的構建器代碼。
您的示例具有嵌套collect{}呼叫,這在某些情況下很好,但在許多情況下不是最佳實踐。我建議閱讀Vasya Drobushkov 的博客文章 Nesting vs. Chaining以了解何時使用哪種方法。簡而言之,鏈接意味著更好的可讀性、錯誤處理和測驗。首選方法是使用 Flow 方法combine()并將zip()您的操作鏈接到多個流上,并flatMap{}在需要時使用操作應用嵌套,最后使用單個收集。
下面是一個例子:
CoroutineScope(Dispatchers.Main).launch {
flow1.zip(flow2) { intValue, stringValue ->
"$intValue$stringValue"
}.collect {
Log.d(TAG, it)
}
}
val flow1: Flow = flowOf(1, 2, 3)
val flow2: Flow = flowOf("A", "B", "C")
結果:
1A
2B
3C
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345181.html
