#1 ๊ฐ์
Coroutines Flow๋ฅผ ์ฌ์ฉํ ๋ ์๊ธธ ์ ์๋ ํ์์ธ ๋ฐฑ ํ๋ ์
(Back pressure)์ ๋ํด ์ดํด๋ณธ๋ค. ๋, ๋ฐฑ ํ๋ ์
๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ์ดํด๋ณธ๋ค. ์ด ๋, ๋ฐฑ ํ๋ ์
๋ ์๋ฌ๊ฐ ์๋ ์์ฐ์ค๋ฌ์ด ํ์์ผ ๋ฟ์ด๋ค. ๋ฐ๋ผ์, ๋ฐฑ ํ๋ ์
๋ฅผ ํด๊ฒฐํ๋ค๋ ํํ์ ์ ํํ์ง ์๋ค. ๋ฐฑ ํ๋ ์
์ ๋์ฒํ๋ค๋ ํํ์ด ์ณ๋ค.
#2 ๋ฐฑ ํ๋ ์
#2-1 ๋ฐฑ ํ๋ ์ ๊ฐ ์๋ ์ฝ๋
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flow
// 1์ด๋ง๋ค 1์ฉ ์ฆ๊ฐํ๋ count
fun startCountUp(count: MutableStateFlow<Int>) {
CoroutineScope(Dispatchers.Default).launch {
while (true) {
delay(1000)
count.value++
}
}
}
fun main() {
// count ์ ์ธ ๋ฐ count๋ฅผ 1์ด๋ง๋ค 1์ฉ ์ฆ๊ฐ์ํค๋ ์ฝ๋ฃจํด ์์
val count = MutableStateFlow(1)
startCountUp(count)
// 1, 2, 3, ...์ ๋ฐฉ์ถํ๋ Flow
val numberFlow: Flow<Int> = flow {
for (i in 1..5) {
delay(1000)
println("Flow ${i}: ์์ฐ๋จ")
emit(i) // ์ซ์ i๋ฅผ '๋ฐฉ์ถ'
}
}
// Flow๋ฅผ collect
runBlocking {
numberFlow.collect { value ->
for (i: Int in 1..11) {
when (i) {
11 -> println("Flow ${value}: ์๋น๋จ (์๊ฐ: ${count.value}์ด)")
else -> {
delay(30) // ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์๊ฐ ํํ
println("Flow ${value}: ์ฒ๋ฆฌ์ค... (${i})")
}
}
}
}
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
Flow 1: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (3)
Flow 1: ์ฒ๋ฆฌ์ค... (4)
Flow 1: ์ฒ๋ฆฌ์ค... (5)
Flow 1: ์ฒ๋ฆฌ์ค... (6)
Flow 1: ์ฒ๋ฆฌ์ค... (7)
Flow 1: ์ฒ๋ฆฌ์ค... (8)
Flow 1: ์ฒ๋ฆฌ์ค... (9)
Flow 1: ์ฒ๋ฆฌ์ค... (10)
Flow 1: ์๋น๋จ (์๊ฐ: 2์ด)
Flow 2: ์์ฐ๋จ
Flow 2: ์ฒ๋ฆฌ์ค... (1)
Flow 2: ์ฒ๋ฆฌ์ค... (2)
Flow 2: ์ฒ๋ฆฌ์ค... (3)
Flow 2: ์ฒ๋ฆฌ์ค... (4)
Flow 2: ์ฒ๋ฆฌ์ค... (5)
Flow 2: ์ฒ๋ฆฌ์ค... (6)
Flow 2: ์ฒ๋ฆฌ์ค... (7)
Flow 2: ์ฒ๋ฆฌ์ค... (8)
Flow 2: ์ฒ๋ฆฌ์ค... (9)
Flow 2: ์ฒ๋ฆฌ์ค... (10)
Flow 2: ์๋น๋จ (์๊ฐ: 3์ด)
Flow 3: ์์ฐ๋จ
Flow 3: ์ฒ๋ฆฌ์ค... (1)
Flow 3: ์ฒ๋ฆฌ์ค... (2)
Flow 3: ์ฒ๋ฆฌ์ค... (3)
Flow 3: ์ฒ๋ฆฌ์ค... (4)
Flow 3: ์ฒ๋ฆฌ์ค... (5)
Flow 3: ์ฒ๋ฆฌ์ค... (6)
Flow 3: ์ฒ๋ฆฌ์ค... (7)
Flow 3: ์ฒ๋ฆฌ์ค... (8)
Flow 3: ์ฒ๋ฆฌ์ค... (9)
Flow 3: ์ฒ๋ฆฌ์ค... (10)
Flow 3: ์๋น๋จ (์๊ฐ: 4์ด)
Flow 4: ์์ฐ๋จ
Flow 4: ์ฒ๋ฆฌ์ค... (1)
Flow 4: ์ฒ๋ฆฌ์ค... (2)
Flow 4: ์ฒ๋ฆฌ์ค... (3)
Flow 4: ์ฒ๋ฆฌ์ค... (4)
Flow 4: ์ฒ๋ฆฌ์ค... (5)
Flow 4: ์ฒ๋ฆฌ์ค... (6)
Flow 4: ์ฒ๋ฆฌ์ค... (7)
Flow 4: ์ฒ๋ฆฌ์ค... (8)
Flow 4: ์ฒ๋ฆฌ์ค... (9)
Flow 4: ์ฒ๋ฆฌ์ค... (10)
Flow 4: ์๋น๋จ (์๊ฐ: 6์ด)
Flow 5: ์์ฐ๋จ
Flow 5: ์ฒ๋ฆฌ์ค... (1)
Flow 5: ์ฒ๋ฆฌ์ค... (2)
Flow 5: ์ฒ๋ฆฌ์ค... (3)
Flow 5: ์ฒ๋ฆฌ์ค... (4)
Flow 5: ์ฒ๋ฆฌ์ค... (5)
Flow 5: ์ฒ๋ฆฌ์ค... (6)
Flow 5: ์ฒ๋ฆฌ์ค... (7)
Flow 5: ์ฒ๋ฆฌ์ค... (8)
Flow 5: ์ฒ๋ฆฌ์ค... (9)
Flow 5: ์ฒ๋ฆฌ์ค... (10)
Flow 5: ์๋น๋จ (์๊ฐ: 7์ด)
*/
Flow์์ emit()๋๋ ์ฆ์ ๋ฐ๋ก๋ฐ๋ก ์ถ๋ ฅํ๋ ํ๋ฒํ Cold Flow ์ฝ๋๋ค. ์ด ์ฝ๋๋ฅผ ์ด์ง ์์ ํด๋ณด๊ฒ ๋ค.
#2-2 ๋ฐฑ ํ๋ ์ ๊ฐ ๋ฐ์ํ๋ ์ฝ๋
...
fun main() {
...
runBlocking {
numberFlow.collect { value ->
for (i: Int in 1..11) {
when (i) {
11 -> ...
else -> {
delay(300) // 30์์ 300์ผ๋ก ๋ณ๊ฒฝ
...
}
}
}
}
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
Flow 1: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (3)
Flow 1: ์ฒ๋ฆฌ์ค... (4)
Flow 1: ์ฒ๋ฆฌ์ค... (5)
Flow 1: ์ฒ๋ฆฌ์ค... (6)
Flow 1: ์ฒ๋ฆฌ์ค... (7)
Flow 1: ์ฒ๋ฆฌ์ค... (8)
Flow 1: ์ฒ๋ฆฌ์ค... (9)
Flow 1: ์ฒ๋ฆฌ์ค... (10)
Flow 1: ์๋น๋จ (์๊ฐ: 5์ด)
Flow 2: ์์ฐ๋จ
Flow 2: ์ฒ๋ฆฌ์ค... (1)
Flow 2: ์ฒ๋ฆฌ์ค... (2)
Flow 2: ์ฒ๋ฆฌ์ค... (3)
Flow 2: ์ฒ๋ฆฌ์ค... (4)
Flow 2: ์ฒ๋ฆฌ์ค... (5)
Flow 2: ์ฒ๋ฆฌ์ค... (6)
Flow 2: ์ฒ๋ฆฌ์ค... (7)
Flow 2: ์ฒ๋ฆฌ์ค... (8)
Flow 2: ์ฒ๋ฆฌ์ค... (9)
Flow 2: ์ฒ๋ฆฌ์ค... (10)
Flow 2: ์๋น๋จ (์๊ฐ: 9์ด)
Flow 3: ์์ฐ๋จ
Flow 3: ์ฒ๋ฆฌ์ค... (1)
Flow 3: ์ฒ๋ฆฌ์ค... (2)
Flow 3: ์ฒ๋ฆฌ์ค... (3)
Flow 3: ์ฒ๋ฆฌ์ค... (4)
Flow 3: ์ฒ๋ฆฌ์ค... (5)
Flow 3: ์ฒ๋ฆฌ์ค... (6)
Flow 3: ์ฒ๋ฆฌ์ค... (7)
Flow 3: ์ฒ๋ฆฌ์ค... (8)
Flow 3: ์ฒ๋ฆฌ์ค... (9)
Flow 3: ์ฒ๋ฆฌ์ค... (10)
Flow 3: ์๋น๋จ (์๊ฐ: 13์ด)
Flow 4: ์์ฐ๋จ
Flow 4: ์ฒ๋ฆฌ์ค... (1)
Flow 4: ์ฒ๋ฆฌ์ค... (2)
Flow 4: ์ฒ๋ฆฌ์ค... (3)
Flow 4: ์ฒ๋ฆฌ์ค... (4)
Flow 4: ์ฒ๋ฆฌ์ค... (5)
Flow 4: ์ฒ๋ฆฌ์ค... (6)
Flow 4: ์ฒ๋ฆฌ์ค... (7)
Flow 4: ์ฒ๋ฆฌ์ค... (8)
Flow 4: ์ฒ๋ฆฌ์ค... (9)
Flow 4: ์ฒ๋ฆฌ์ค... (10)
Flow 4: ์๋น๋จ (์๊ฐ: 17์ด)
Flow 5: ์์ฐ๋จ
Flow 5: ์ฒ๋ฆฌ์ค... (1)
Flow 5: ์ฒ๋ฆฌ์ค... (2)
Flow 5: ์ฒ๋ฆฌ์ค... (3)
Flow 5: ์ฒ๋ฆฌ์ค... (4)
Flow 5: ์ฒ๋ฆฌ์ค... (5)
Flow 5: ์ฒ๋ฆฌ์ค... (6)
Flow 5: ์ฒ๋ฆฌ์ค... (7)
Flow 5: ์ฒ๋ฆฌ์ค... (8)
Flow 5: ์ฒ๋ฆฌ์ค... (9)
Flow 5: ์ฒ๋ฆฌ์ค... (10)
Flow 5: ์๋น๋จ (์๊ฐ: 21์ด)
*/
#2-1 ์ฝ๋๋ฅผ ์์ ํ ๋ฒ์ ์ด๋ค. numberFlow ์์ฒด๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๋ค. ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ํค๋ ๊ณณ์์๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณณ์ ๋๋ ์ด๋ฅผ 10๋ฐฐ ์ฆ๊ฐ์ํค์, ๋ฐ์ดํฐ ์ถ๋ ฅ์ ์ง์ฐ์ด ๋ฐ์ํ๋ค.
์ด์ ๊ฐ์ด, ๋ฐ์ดํฐ์ ์์ฐ ์๋๋ฅผ ๋ฐ์ดํฐ์ ์๋น ์๋๊ฐ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋ ํ์์ ๋ฐฑ ํ๋ ์
๋ผ๊ณ ์ผ์ปซ๋๋ค. ์ด๋ฅธ๋ฐ ๊ณต๊ธ ๊ณผ์์ด๋ค.
#3 ๋ฐฑ ํ๋ ์ ๋์ฒ๋ฒ
#3-1 buffer()๋ฅผ ์ด์ฉํด collect() ๋ณ๋ ฌํ
...
import kotlinx.coroutines.flow.buffer
...
fun main() {
...
runBlocking {
numberFlow.buffer().collect { value -> // Flow ๋์ Flow.buffer()๋ฅผ collect()
...
}
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
Flow 1: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (3)
Flow 2: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (4)
Flow 1: ์ฒ๋ฆฌ์ค... (5)
Flow 1: ์ฒ๋ฆฌ์ค... (6)
Flow 3: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (7)
Flow 1: ์ฒ๋ฆฌ์ค... (8)
Flow 1: ์ฒ๋ฆฌ์ค... (9)
Flow 4: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (10)
Flow 1: ์๋น๋จ (์๊ฐ: 5์ด)
Flow 2: ์ฒ๋ฆฌ์ค... (1)
Flow 2: ์ฒ๋ฆฌ์ค... (2)
Flow 5: ์์ฐ๋จ
Flow 2: ์ฒ๋ฆฌ์ค... (3)
Flow 2: ์ฒ๋ฆฌ์ค... (4)
Flow 2: ์ฒ๋ฆฌ์ค... (5)
Flow 2: ์ฒ๋ฆฌ์ค... (6)
Flow 2: ์ฒ๋ฆฌ์ค... (7)
Flow 2: ์ฒ๋ฆฌ์ค... (8)
Flow 2: ์ฒ๋ฆฌ์ค... (9)
Flow 2: ์ฒ๋ฆฌ์ค... (10)
Flow 2: ์๋น๋จ (์๊ฐ: 8์ด)
Flow 3: ์ฒ๋ฆฌ์ค... (1)
Flow 3: ์ฒ๋ฆฌ์ค... (2)
Flow 3: ์ฒ๋ฆฌ์ค... (3)
Flow 3: ์ฒ๋ฆฌ์ค... (4)
Flow 3: ์ฒ๋ฆฌ์ค... (5)
Flow 3: ์ฒ๋ฆฌ์ค... (6)
Flow 3: ์ฒ๋ฆฌ์ค... (7)
Flow 3: ์ฒ๋ฆฌ์ค... (8)
Flow 3: ์ฒ๋ฆฌ์ค... (9)
Flow 3: ์ฒ๋ฆฌ์ค... (10)
Flow 3: ์๋น๋จ (์๊ฐ: 11์ด)
Flow 4: ์ฒ๋ฆฌ์ค... (1)
Flow 4: ์ฒ๋ฆฌ์ค... (2)
Flow 4: ์ฒ๋ฆฌ์ค... (3)
Flow 4: ์ฒ๋ฆฌ์ค... (4)
Flow 4: ์ฒ๋ฆฌ์ค... (5)
Flow 4: ์ฒ๋ฆฌ์ค... (6)
Flow 4: ์ฒ๋ฆฌ์ค... (7)
Flow 4: ์ฒ๋ฆฌ์ค... (8)
Flow 4: ์ฒ๋ฆฌ์ค... (9)
Flow 4: ์ฒ๋ฆฌ์ค... (10)
Flow 4: ์๋น๋จ (์๊ฐ: 14์ด)
Flow 5: ์ฒ๋ฆฌ์ค... (1)
Flow 5: ์ฒ๋ฆฌ์ค... (2)
Flow 5: ์ฒ๋ฆฌ์ค... (3)
Flow 5: ์ฒ๋ฆฌ์ค... (4)
Flow 5: ์ฒ๋ฆฌ์ค... (5)
Flow 5: ์ฒ๋ฆฌ์ค... (6)
Flow 5: ์ฒ๋ฆฌ์ค... (7)
Flow 5: ์ฒ๋ฆฌ์ค... (8)
Flow 5: ์ฒ๋ฆฌ์ค... (9)
Flow 5: ์ฒ๋ฆฌ์ค... (10)
Flow 5: ์๋น๋จ (์๊ฐ: 17์ด)
*/
๋จผ์ , Flow ๋์ Flow.buffer()๋ฅผ collect()ํ๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, emit๋ ๋ฐ์ดํฐ๋ฅผ ์๋น ์๋ฃํ์ง ์์ ์ํ์์๋ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์์ฐํ๊ณ ์์์ ์ ์ ์๋ค. ์์ฐ๋ถ์ ์์ฐ๋๋๋๋ก ์ผ๋จ buffer์ ์ ์ฅํ๊ณ , ์๋น๋ ๋์ค์ ์์์ ํ๋ ์์ด๋ค.
ํ์ง๋ง, Flow 5๊ฐ ์๋น ์๋ฃ๋ ์๊ฐ์ 17์ด๋ก #2-2์ ์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค. buffer๊ฐ ์๋ ์๋ , collect์ ๋์์ ์ฌ์ ํ ๋จ์ผ ์ค๋ ๋์์ ์ด๋ค์ง๋ฏ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์๊ธฐ์ง ์บ์๋ค. ์ด ๋ buffer์๋ ์์ฐ๋๋ ์กฑ์กฑ ๋ฐ์ดํฐ๊ฐ ์์ธ๋ค๋ ์ ์ ์ฐฉ์ํ์ฌ, ์๋นํ๋ ์ธก์์๋ buffer์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋๋๋ก Coroutine์ ์ํํ๋ค๋ฉด ์๋น ์๊ฐ์ ์ค์ผ ์ ์์ ๊ฒ์ด๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
...
fun main() {
...
runBlocking {
numberFlow.buffer().collect { value ->
launch { // ์์ ์ฝ๋ฃจํด ์์ฑ
...
}
}
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
Flow 1: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (3)
Flow 2: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (4)
Flow 2: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (5)
Flow 2: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (6)
Flow 2: ์ฒ๋ฆฌ์ค... (3)
Flow 3: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (7)
Flow 2: ์ฒ๋ฆฌ์ค... (4)
Flow 3: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (8)
Flow 2: ์ฒ๋ฆฌ์ค... (5)
Flow 3: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (9)
Flow 2: ์ฒ๋ฆฌ์ค... (6)
Flow 3: ์ฒ๋ฆฌ์ค... (3)
Flow 4: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (10)
Flow 1: ์๋น๋จ (์๊ฐ: 5์ด)
Flow 2: ์ฒ๋ฆฌ์ค... (7)
Flow 3: ์ฒ๋ฆฌ์ค... (4)
Flow 4: ์ฒ๋ฆฌ์ค... (1)
Flow 2: ์ฒ๋ฆฌ์ค... (8)
Flow 3: ์ฒ๋ฆฌ์ค... (5)
Flow 4: ์ฒ๋ฆฌ์ค... (2)
Flow 2: ์ฒ๋ฆฌ์ค... (9)
Flow 3: ์ฒ๋ฆฌ์ค... (6)
Flow 4: ์ฒ๋ฆฌ์ค... (3)
Flow 5: ์์ฐ๋จ
Flow 2: ์ฒ๋ฆฌ์ค... (10)
Flow 2: ์๋น๋จ (์๊ฐ: 6์ด)
Flow 3: ์ฒ๋ฆฌ์ค... (7)
Flow 4: ์ฒ๋ฆฌ์ค... (4)
Flow 5: ์ฒ๋ฆฌ์ค... (1)
Flow 3: ์ฒ๋ฆฌ์ค... (8)
Flow 4: ์ฒ๋ฆฌ์ค... (5)
Flow 5: ์ฒ๋ฆฌ์ค... (2)
Flow 3: ์ฒ๋ฆฌ์ค... (9)
Flow 4: ์ฒ๋ฆฌ์ค... (6)
Flow 5: ์ฒ๋ฆฌ์ค... (3)
Flow 3: ์ฒ๋ฆฌ์ค... (10)
Flow 3: ์๋น๋จ (์๊ฐ: 7์ด)
Flow 4: ์ฒ๋ฆฌ์ค... (7)
Flow 5: ์ฒ๋ฆฌ์ค... (4)
Flow 4: ์ฒ๋ฆฌ์ค... (8)
Flow 5: ์ฒ๋ฆฌ์ค... (5)
Flow 4: ์ฒ๋ฆฌ์ค... (9)
Flow 5: ์ฒ๋ฆฌ์ค... (6)
Flow 4: ์ฒ๋ฆฌ์ค... (10)
Flow 4: ์๋น๋จ (์๊ฐ: 8์ด)
Flow 5: ์ฒ๋ฆฌ์ค... (7)
Flow 5: ์ฒ๋ฆฌ์ค... (8)
Flow 5: ์ฒ๋ฆฌ์ค... (9)
Flow 5: ์ฒ๋ฆฌ์ค... (10)
Flow 5: ์๋น๋จ (์๊ฐ: 9์ด)
*/
collect() ๋ด๋ถ์ ์์ ์ฝ๋ฃจํด์ ๋ง๋ค์ด ๋ฐ์ดํฐ ์๋น๋ฅผ ๋ณ๋ ฌํํ๋ค.
#3-2 collectLatest()๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ์ ๋ณ
...
fun main() {
...
runBlocking {
numberFlow.collectLatest { value -> // collect() ๋์ collectLatest() ์ฌ์ฉ
...
}
}
}
/* ↑ ↑ ↑ ์ถ๋ ฅ ๊ฒฐ๊ณผ
Flow 1: ์์ฐ๋จ
Flow 1: ์ฒ๋ฆฌ์ค... (1)
Flow 1: ์ฒ๋ฆฌ์ค... (2)
Flow 1: ์ฒ๋ฆฌ์ค... (3)
Flow 2: ์์ฐ๋จ
Flow 2: ์ฒ๋ฆฌ์ค... (1)
Flow 2: ์ฒ๋ฆฌ์ค... (2)
Flow 2: ์ฒ๋ฆฌ์ค... (3)
Flow 3: ์์ฐ๋จ
Flow 3: ์ฒ๋ฆฌ์ค... (1)
Flow 3: ์ฒ๋ฆฌ์ค... (2)
Flow 3: ์ฒ๋ฆฌ์ค... (3)
Flow 4: ์์ฐ๋จ
Flow 4: ์ฒ๋ฆฌ์ค... (1)
Flow 4: ์ฒ๋ฆฌ์ค... (2)
Flow 4: ์ฒ๋ฆฌ์ค... (3)
Flow 5: ์์ฐ๋จ
Flow 5: ์ฒ๋ฆฌ์ค... (1)
Flow 5: ์ฒ๋ฆฌ์ค... (2)
Flow 5: ์ฒ๋ฆฌ์ค... (3)
Flow 5: ์ฒ๋ฆฌ์ค... (4)
Flow 5: ์ฒ๋ฆฌ์ค... (5)
Flow 5: ์ฒ๋ฆฌ์ค... (6)
Flow 5: ์ฒ๋ฆฌ์ค... (7)
Flow 5: ์ฒ๋ฆฌ์ค... (8)
Flow 5: ์ฒ๋ฆฌ์ค... (9)
Flow 5: ์ฒ๋ฆฌ์ค... (10)
Flow 5: ์๋น๋จ (์๊ฐ: 9์ด)
*/
collectLatest()๋ ์ต์ ๋ฐ์ดํฐ๋ง์ ์ ๋ณํ๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ์ด์ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ๋์ค ์ต์ ๋ฐ์ดํฐ๊ฐ ์์ฐ๋๋ฉด ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ๋ฒ๋ฆฐ๋ค๋ ๊ฑธ ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ํ์ฌ ๋ ์จ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ์ต์ ๋ฐ์ดํฐ๊ฐ ์์ฐ๋ ์ด์ ์ด์ ๋ฐ์ดํฐ๋ ๊ฐ์น๊ฐ 0์ ์๋ ดํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ฌ์ฉํ ๋งํ๋ค.
#4 ์์ฝ
๋ฐฑ ํ๋ ์ ๋ ๊ณต๊ธ ๊ณผ์์ด๋ค. ๊ณต๊ธ์ ๋ณ๋ ฌํ(buffer + coroutine)ํ๊ฑฐ๋, ์ ๋ณ(collectLatest)ํ์ฌ ๋์ฒํ๋ค.
'๊นจ์ ๊ฐ๋ ๐ > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] Coroutines Flow - StateFlow (0) | 2024.08.17 |
---|---|
[Kotlin] Coroutines Flow - Intermediate operator (0) | 2024.08.16 |
[Kotlin] Coroutines Flow - ๊ธฐ์ด (0) | 2024.08.01 |
[Kotlin] Coroutines - ํ Scope ๋ด์์์ ๊ณ์ธต ๊ด๊ณ (0) | 2024.07.31 |
[Kotlin] ์์ ํ๋กํผํฐ (Delegated properties) (0) | 2024.07.22 |