about Flow feat(ColdFlow, HotFlow)

creativeBinยท2022๋…„ 12์›” 27์ผ
0

๐Ÿ’ก ColdFlow , HotFlow์˜ ์ฐจ์ด์ ์„ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด๋ณด์ž.

Flow

Flow ๋ž€?

์ฝ”ํ‹€๋ฆฐ ํ”Œ๋กœ์šฐ๋Š” suspend function์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ์นœ๊ตฌ์ด๋‹ค.

๋น„๋™๊ธฐ ๋™์ž‘์˜ ๊ฒฐ๊ณผ๋กœ suspend function ์ด ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ ๋˜์ง„๋‹ค๋ฉด,
ํ”Œ๋กœ์šฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋˜์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ง•

๋น„๋™๊ธฐ์ด๋ฉฐ ์ฝ”๋ฃจํ‹ด์—์„œ๋งŒ ๋™์ž‘ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ suspend function ๊ณผ ๋™์ผํ•˜๋‹ค.

๋‹ค๋ฅธ ์ ์€ ํ•จ์ˆ˜ ์•ž์— suspend ๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

Flow Builder ์œ ํ˜•


  • flowOf() ์ฃผ์–ด์ง„ ํ•ญ๋ชฉ ์ง‘ํ•ฉ์—์„œ ํ๋ฆ„์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
flowOf(4, 2, 5, 1, 7)
.collect {
    Log.d(TAG, it.toString())
}

  • asFlow() Type์„ Flow๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
(1..5).asFlow()
.collect {
    Log.d(TAG, it.toString())
}

  • flow{} ์ด๊ฒƒ์ด Flow์˜ Hello World ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
flow {
    (0..10).forEach {
        emit(it)
    }
}
.collect {
    Log.d(TAG, it.toString())
}

  • channelFlow{} ์ด ๋นŒ๋”๋Š” ๋นŒ๋” ์ž์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” send๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋กœ ํ๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
channelFlow {
    (0..10).forEach {
        send(it)
    }
}
.collect {
    Log.d(TAG, it.toString())
}

cold stream ( kotlin์˜ sequence )์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ hot stream ์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋ฐ์ดํ„ฐ๋Š” ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ๋ฐœํ–‰๋˜๋ฉฐ,

์š”์ฒญ ์ „์—๋Š” ์„ ์–ธ๋งŒ ์žˆ์„ ๋ฟ ์•„๋ฌด๋Ÿฐ ๋™์ž‘๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ง์ ‘ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๋”ฐ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

https://developer.android.com/kotlin/flow?hl=ko


cold-flow-vs-hot-flow

ColdFlow

  • Collector๊ฐ€ ์žˆ์„๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ emit ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์—ฌ๋Ÿฌ Collector๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
  • 1 : 1
# [SharedFlow]

ํ•˜๋‚˜์˜ ์†Œ๋น„์ž(Consumer)์—๊ฒŒ ๊ฐ’์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
์ƒ์„ฑ๋œ ์ดํ›„์— ๋ˆ„๊ตฐ๊ฐ€ ์†Œ๋น„ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์ฝ์„ ๋•Œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฝ๊ฑฐ๋‚˜ URL์„ ํ†ตํ•ด์„œ ์„œ๋ฒ„ ๊ฐ’์„ ์ฝ๋Š” ๊ฒฝ์šฐ Cold Stream์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HotFlow

  • Collector๊ฐ€ ์—†์–ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ emit ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์—ฌ๋Ÿฌ Collector๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • 1 : N
# [StateFlow]

ํ•˜๋‚˜ ์ด์ƒ์˜ ์†Œ๋น„์ž(Consumer)์—๊ฒŒ ๊ฐ’์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ๋ฐœํ–‰์ด ์‹œ์ž‘๋œ ์ดํ›„ ๋ถ€ํ„ฐ ๋ชจ๋“  ์†Œ๋น„์ž์—๊ฒŒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ตฌ๋…์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ์ฝ์„ ๋•Œ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ์ •๋ณด ๊ฐ’์„ ์–ป์–ด์˜ฌ ๋•Œ Hot Stream์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
profile
์–ธ์ œ๋‚˜ ํ•ญ์ƒ ์ฆ๊ฒ๊ฒŒ New vibes ๐Ÿ˜Ž

0๊ฐœ์˜ ๋Œ“๊ธ€