μν μμΈ νλ©΄μμ μν μμΈ μ 보(DetailState)μ ν΅ λ©μμ§(QuickMessageUiModel) μ 보μ κ²°ν©μ ν΅ν΄ UI μν κ΄λ¦¬λ₯Ό ν λ°μ΄ν°(QuickMessageViewState)λ₯Ό μμ±ν΄μΌνλ€.
μν μμΈμ 보λ Server APIλ₯Ό ν΅ν΄ νλ©΄ μ§μ
μ λ¨Όμ κ°μ Έμ€κ³ , ν΅ λ©μμ§ μ 보λ Firebase Remote Configλ₯Ό ν΅ν΄ κ°μ Έμ¨λ€.
μ΄ κ³Όμ μμ λΉμ°ν μν©μ μλ§μ μ°μ°μλ₯Ό μ¬μ©ν΄μΌ νμμλ λΆκ΅¬νκ³ κ°λ³κ² μκ°νκ³ μ§λμ³λ²λ Έλ€.
(Zipμ μ¬μ©ν΄μΌ νλ μν©μΈλ°β¦ Combineμ..?)
ν΄λΉ μ€μλ₯Ό isaacμ΄ μ ννκ² μ§μ΄ μ£Όμ
¨κ³ μμ ν κ³Όμ μ λν κΈμ΄λ€.
/**
* μν μμΈ μ 보μ ν΅ λ©μμ§ κ²°ν©
*/
fun getCombinedData(): Flow<Pair<DetailState, QuickMessageUiModel>> {
return combine(_detailState, _quickMessage) { detailState, quickMessage ->
Pair(detailState, quickMessage)
}
}
κ·Έ νμλ update λμ΄μλ μν μμΈ μ 보(detailState)μ ν΅ λ©μμ§ λ°μ΄ν°(quickMessage)λ₯Ό κ²°ν©νμλ€.
λ°λ‘ μ΄ λΆλΆμμ λ¬Έμ κ° λμλ€.
combineμ μ©λλ₯Ό μ λͺ¨λ₯Έλ€λ©΄, ν΅ λ©μμ§μ μν μμΈ μ 보μμ μ°κ΄μ±μ λͺ¨λ₯Έλ€λ©΄ κ·Έλ₯ μ§λμΉ μ μλ μ½λμ΄λ€. (λ μμλλ° μ,,? π€·ββοΈ)
μ΄ μ½λλ λ°λμ Combineλ³΄λ€ Zip μ°μ°μλ₯Ό μ¬μ©νλ κ²μ΄ λ§λ€.
Combineκ³Ό Zipμ λν΄ μ€λͺ
νκΈ° μ μ μν©μ λ¨Όμ κ°λ΅νκ² μ€λͺ
νμλ©΄, κ°κ°μ ν΅ λ©μμ§λ₯Ό ν΄λ¦νλ©΄ μ΄λ ν λμμ νκ² λλ€.
μ΄ λ ν΅ λ©μμ§μ λ΄μ©κ³Ό μν μμΈ μ 보μμ λ°μμ¨ itemIdxλ₯Ό ν¨κ» μκ³ μμ΄μΌνλ€.
μ¦ ν΅λ©μμ§μ μν μμΈμ 보λ λ§€μΉμ΄ λμ΄μΌ νκ³ , λ κ°κ° μ§μ μ΄λ€μ λ λ°©μΆμ΄ λλ κ²μ΄ λ§λ€.
μ΄ λμ 곡ν΅μ μ βκ²°ν©βμ νλ€λ κ²μ΄κ³ μλμ κ°μ μ°¨μ΄μ μ΄ μλ€.

Flowμ μμλ₯Ό λκΈ°ννκ³ κ²°ν©ν΄μΌ νλ κ²½μ°μ μ ν©.output Flowλ λ input Flow λͺ¨λ λ°νν λλ§ λ°©μΆνκ³ κ·Έλ κΈ°μ μμκ° μ μ§λλ€.input Flow μ€ νλκ° λ€λ₯Έ Flowλ³΄λ€ λ μμ£Ό λ°ννλ κ²½μ° λλ¦° Flowκ° λ°λΌμ‘μ λκΉμ§ λκΈ°ν ν κ²°ν©λ μμλ₯Ό λ°ννλ€.ex) μ¬μ©μ IDμ μ¬μ©μμ μ΄λ¦μ λ§€μΉνμ¬ λ°©μΆν λ
private fun main(): Unit = runBlocking {
println("\nCombine")
val combine = getIds().combine(getNames()) { id, name ->
"$id: $name"
}
combine.collect {
log(it)
}
}
private fun getIds() = flow {
for (i in 0 until 3) {
delay(100L)
emit(ids[i])
}
}
private fun getNames() = flow {
for (i in 0 until 3) {
delay(200L)
emit(names[i])
}
}


Flowμ μμλ₯Ό κ²°ν©νκ³ μ
λ ₯ νλ¦μ΄ μμ±λ λ λ§λ€ μ
λ°μ΄νΈλ₯Ό λ΄λ³΄λ΄λ €λ κ²½μ°μ μ μ©.input Flow μ€ νλκ° λ°νν λλ§λ€ outputμ΄ λ°νλλ€.transform ν¨μλ κ° Flowμμ μ΅μ μμλ₯Ό κ²°ν©νμ¬ κ²°ν©λ μμλ₯Ό μμ±νλ€.output Flowλ ν κ°μ input Flowλ³΄λ€ μμ£Ό μμλ₯Ό λ°νν μ μκ³ , input Flowκ° λ°ννλ μλμ λ°λΌ λ¬λΌμ§λ€.ex) μ¨λμ μ΅λλ₯Ό ν¨κ» 보μ¬μ£Όλ μ¨λκ³μμ μ¨λμ μ΅λκ° κ°κ° μ λ°μ΄νΈ λ λ λ§λ€ λ°©μΆν λ
private fun main(): Unit = runBlocking {
val zip = getIds().zip(getNames()) { id, name ->
"$id: $name"
}
println("\nZip")
zip.collect {
log(it)
}
println("\nCombine")
val combine = getIds().combine(getNames()) { id, name ->
"$id: $name"
}
combine.collect {
log(it)
}
}
private fun getIds() = flow {
for (i in 0 until 3) {
delay(100L)
emit(ids[i])
}
}
private fun getNames() = flow {
for (i in 0 until 3) {
delay(200L)
emit(names[i])
}
}

μμ κ°μ μ°¨μ΄μ λ€λ‘ μΈν΄ λμ΄ ν¨κ» λ°©μΆλμ΄μΌ νλ λ΄ μν©μμλ combineμ μ°λ κ²μ λΉν¨μ¨μ μ΄λ€
/**
* μν μμΈ μ 보μ ν΅ λ©μμ§ κ²°ν©
*/
fun bindGetItemDetailQuickMessage() {
viewModelScope.launch {
_detailState.zip(fetchQuickMessage()) { itemDetail, quickMessage ->
QuickMessageViewState(itemDetail, quickMessage)
}.collect { result ->
_quickMessageState.update {
it.copy(
detail = result.detail,
quickMessage = result.quickMessage
)
}
}
}
}