Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

일회성 이벤트를 처리하는 방법을 SharedFlow 에서 Channel 로 변경 #157

Merged
merged 1 commit into from
Mar 14, 2024

Conversation

easyhooon
Copy link
Collaborator

  • SharedFlow 의 경우 Shared 라는 키워드 처럼, 여러 Observer 가 동시에 event 를 구독할 수 있음, Channel 은 단일한 Observer
  • 일회성 이벤트의 경우 해당 이벤트를 구독하는 Observer 는 그 화면 하나가 전부(하나의 구독자를 위한 이벤트)
  • 또한 sharedFlow 는 hotFlow 이기 때문에 observer 가 존재하지 않는 경우에도 계속 이벤트를 방출함, 따라서 앱이 백그라운드에 진입했을 때 에도, 계속해서 이벤트가 방출됨
  • 앱이 백그라운드에 진입할 경우, Observer 는 이벤트를 수집하지 않기에, 백그라운드에 진입된 동안 sharedFlow 가 방출한 이벤트들은 유실됨
  • 따라서 이벤트를 방출하는 동안 configuration change 가 발생할 경우, 극히 적은 확률이지만 이벤트가 유실될 가능성이 존재
  • Channel 의 경우 백그라운드에 진입하여 이벤트를 수집할 구독자가 존재하지 않을 경우, 이벤트를 캐싱하고, 다시 구독자가 수집을 시작할 경우, 캐싱한 이벤트를 방출함
  • Channel 역시 이벤트가 방출되는 동안 configration change 가 발생할 경우, 이벤트가 유실될 가능성이 존재하지만 ObserveAsEvent 함수가 이를 방지할 수 있음(Main.immediate Dispatcher 에서 이벤트를 수집하는 방식)
  • StateFlow 를 통해 일회성 이벤트를 처리해줄 경우, configuration change 가 발생할 경우, 이벤트가 유실될 가능성은 존재하지 않지만, 이벤트가 종료 후, 이전 상태로 다시 원복해줘야하만 하는 번거로움이 존재(휴먼 에러 발생 가능성)

참고)
https://medium.com/androiddevelopers/viewmodel-one-off-event-antipatterns-16a1da869b95
https://proandroiddev.com/viewmodel-events-as-state-are-an-antipattern-35ff4fbc6fb6
https://www.youtube.com/watch?v=njchj9d_Lf8
https://www.youtube.com/watch?v=QNrNKPKe5oc&t=11s
https://velog.io/@morning-la/Kotlin-Coroutine%EC%9D%98-SharedFlow-%EC%99%80-Channel

- SharedFlow 의 경우 Shared 라는 키워드 처럼, 여러 Observer 가 동시에 event 를 구독할 수 있음, Channel 은 단일한 Observer
- 일회성 이벤트의 경우 해당 이벤트를 구독하는 Observer 는 그 화면 하나가 전부(하나의 구독자를 위한 이벤트)
- 또한 sharedFlow 는 hotFlow 이기 때문에 observer 가 존재하지 않는 경우에도 계속 이벤트를 방출함, 따라서 앱이 백그라운드에 진입했을 때 에도, 계속해서 이벤트가 방출됨
- 앱이 백그라운드에 진입할 경우, Observer 는 이벤트를 수집하지 않기에, 백그라운드에 진입된 동안 sharedFlow 가 방출한 이벤트들은 유실됨
- 따라서 이벤트를 방출하는 동안 configuration change 가 발생할 경우, 극히 적은 확률이지만 이벤트가 유실될 가능성이 존재
- Channel 의 경우 백그라운드에 진입하여 이벤트를 수집할 구독자가 존재하지 않을 경우, 이벤트를 캐싱하고, 다시 구독자가 수집을 시작할 경우, 캐싱한 이벤트를 방출함
- Channel 역시 이벤트가 방출되는 동안 configration change 가 발생할 경우, 이벤트가 유실될 가능성이 존재하지만 ObserveAsEvent 함수가 이를 방지할 수 있음
@easyhooon easyhooon added the refactoring Code restructure for better readability and efficiency label Jan 8, 2024
@easyhooon easyhooon self-assigned this Jan 8, 2024
@easyhooon easyhooon merged commit fb5c962 into develop Mar 14, 2024
1 check passed
@easyhooon easyhooon deleted the refactoring/shared-flow-to-channel branch March 14, 2024 02:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
refactoring Code restructure for better readability and efficiency
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant