μν μμΈ νλ©΄μμ μν μμΈ μ 보(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
)
}
}
}
}