카테고리 없음

Flow 생성 : flowOf(), flow { emit() }

God.Joy 2023. 4. 11. 15:38

Flow를 생성하고 값을 방출하기 위해서는 flowOf() 를 사용할 수도 있고, flow { emit() } 을 사용할 수도 있다.

flowOf()는 값을 넘겨받아 emit() 하여 Flow를 생성하는 함수다.

 

난 이 두개가 어떤 차이를 가지고 있는지 알지 못하고 flowOf는 더 간편하게 flow를 만들 수 있는거~ 라는 대략의 생각으로 사용했다.

근데요..? zip 함수에 대해 찾아보다가 StackOverFlow에서 한 댓글을 발견하게 됩니다

 

각 차이를 한번 보자면 

flowOf()
flow { .. }

2023.04.17 추가 수정 

flowOf 도 결국에는 내부에서 flow { emit() }  방식으로 flow를 만들고 있다.

하지만 둘을 비교해봤을 때, flowOf 를 사용하면 병렬 실행이 되지 않는 이유는 인자를 받는 부분에서 차이가 나기 때문인 것 같다.

flowOf를 사용할 경우 value를 받아 flow를 만드는 반면, flow { .. } 방식은 값이 아닌 suspend block인 FlowCollector 인터페이스를 받고 있다. 

결국 flowOf는 value가 전달되어야 Flow를 생성하고 emit() 이 이루어지는데, 이 값을 전달하는 과정은 suspend가 아니기 때문에 일시중단이 불가능하고 때문에 병렬적인 실행이 불가능한 것 아닐까?

 

flowOf 는 결국 이미 만들어진 값에 대해 방출을 할 때, 편하게 flow의 생성과 방출을 돕기 위한 함수!

라는 결론을 내렸다.


오..믿을 수 없어서 직접 코드에 적용해봤는데, 로그로 확인해보니 진짜였다.

 

FlowOf 사용

val data1Flow = flowOf(repository.getData1())
val data2Flow = flowOf(repository.getData2())

 

flowOf 를 사용한 코드 결과

getData1 의 작업이 끝난 후에야 getData2를 시작한다.

 

Flow { emit() } 사용

val data1Flow = flow { emit(repository.getData1()) }
val data2Flow = flow { emit(repository.getData2()) }

 

flow { emit() } 을 사용한 결과

getData1 과 getData2의 호출이 동시에 이루어졌다.

워낙 통신 속도가 빨라서 실제 동작에서는 근소한 차이겠지만, 그래도 아주 간단하게 성능을 더 올릴 수 있는 방법을 알게되었다.

 

결론

병렬 실행이 필요하다면 flow { emit() } 을 사용하자

Stefan씨 어디서 보고계실지 모르겠는데 감사합니다👍 _from korea Joy