SharedFlow for event broadcasting in Kotlin - Time & Space Complexity
We want to understand how the time cost changes when using SharedFlow to send events to many listeners.
How does the number of listeners affect the work done when broadcasting an event?
Analyze the time complexity of the following code snippet.
val sharedFlow = MutableSharedFlow()
suspend fun broadcastEvent(event: String) {
sharedFlow.emit(event) // send event to all subscribers
}
fun subscribe() {
sharedFlow.onEach { event ->
println("Received: $event")
}.launchIn(scope)
}
This code sends an event to all subscribers using SharedFlow, which broadcasts to multiple listeners.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Emitting an event triggers notifying each subscriber.
- How many times: Once per subscriber, so the number of subscribers determines repetitions.
When you send one event, the work grows with how many listeners are subscribed.
| Number of Subscribers (n) | Approx. Notifications |
|---|---|
| 10 | 10 notifications |
| 100 | 100 notifications |
| 1000 | 1000 notifications |
Pattern observation: The work grows directly with the number of subscribers.
Time Complexity: O(n)
This means sending one event takes time proportional to how many listeners are subscribed.
[X] Wrong: "Emitting an event is always fast and does not depend on subscribers."
[OK] Correct: Each subscriber must receive the event, so more subscribers mean more work.
Understanding how event broadcasting scales helps you design responsive apps and explain performance in real projects.
"What if we buffer events in SharedFlow? How would that affect the time complexity of emitting events?"
Practice
SharedFlow in Kotlin?Solution
Step 1: Understand SharedFlow's role
SharedFlow is designed to send events to many listeners at once, like a radio broadcast.Step 2: Compare with other options
It does not store data permanently, perform heavy computations, or create single-threaded queues.Final Answer:
To broadcast events to multiple listeners simultaneously -> Option AQuick Check:
SharedFlow = Broadcast events [OK]
- Confusing SharedFlow with data storage
- Thinking SharedFlow handles computations
- Assuming SharedFlow is single-threaded queue
SharedFlow with replay of 2 events?Solution
Step 1: Recall SharedFlow creation syntax
MutableSharedFlow constructor uses parameterreplayto set how many past events to keep.Step 2: Check options for correct parameter
Only val flow = MutableSharedFlow<Int>(replay = 2) usesreplay = 2correctly. Others use wrong parameter names or types.Final Answer:
val flow = MutableSharedFlow<Int>(replay = 2) -> Option BQuick Check:
Use replay parameter to set past events [OK]
- Using SharedFlow instead of MutableSharedFlow for creation
- Wrong parameter names like bufferSize or replayCount
- Confusing replay with buffer
val flow = MutableSharedFlow<Int>(replay = 1)
suspend fun main() {
flow.emit(10)
flow.emit(20)
flow.collect { value ->
println(value)
}
}Solution
Step 1: Understand replay behavior
Withreplay = 1, only the last emitted value is kept for new collectors.Step 2: Analyze emitted values and collection
Values 10 and 20 are emitted, but only 20 is replayed to the collector.Final Answer:
20 -> Option CQuick Check:
Replay 1 means last event only [OK]
- Expecting all emitted values to be replayed
- Confusing replay with buffer size
- Thinking collector receives events emitted before subscription
val flow = MutableSharedFlow<Int>()
suspend fun main() {
flow.collect { println(it) }
flow.emit(5)
}Solution
Step 1: Understand collect and emit behavior
collect is a suspending function that waits for events and blocks until cancelled.Step 2: Analyze code flow
Since collect is called first and blocks, emit is never reached. emit must be called concurrently.Final Answer:
collect should be launched in a separate coroutine -> Option AQuick Check:
collect blocks; emit needs separate coroutine [OK]
- Calling emit after collect in same coroutine
- Assuming emit runs before collect automatically
- Thinking replay parameter is mandatory
SharedFlow. Which approach correctly ensures all components receive the latest 3 clicks even if they subscribe late?Solution
Step 1: Identify replay requirement
Replay of 3 means new subscribers get last 3 events automatically.Step 2: Match with SharedFlow usage
MutableSharedFlow withreplay = 3fits perfectly for broadcasting recent events to multiple listeners.Step 3: Evaluate other options
MutableStateFlow holds only one value, Channel does not replay past events, List is manual and not reactive.Final Answer:
Create a MutableSharedFlow with replay = 3 and emit clicks; components collect from it -> Option DQuick Check:
Replay 3 in SharedFlow broadcasts last 3 events [OK]
- Using StateFlow which holds only one value
- Using Channel which doesn't replay past events
- Manually managing event lists instead of reactive streams
Ready to prove it?
Pass the test and this pattern moves unknown
