Flow 생성 : flowOf(), flow { emit() }
Flow를 생성하고 값을 방출하기 위해서는 flowOf() 를 사용할 수도 있고, flow { emit() } 을 사용할 수도 있다.
flowOf()는 값을 넘겨받아 emit() 하여 Flow를 생성하는 함수다.
난 이 두개가 어떤 차이를 가지고 있는지 알지 못하고 flowOf는 더 간편하게 flow를 만들 수 있는거~ 라는 대략의 생각으로 사용했다.
근데요..? zip 함수에 대해 찾아보다가 StackOverFlow에서 한 댓글을 발견하게 됩니다
각 차이를 한번 보자면
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())
getData1 의 작업이 끝난 후에야 getData2를 시작한다.
Flow { emit() } 사용
val data1Flow = flow { emit(repository.getData1()) }
val data2Flow = flow { emit(repository.getData2()) }
getData1 과 getData2의 호출이 동시에 이루어졌다.
워낙 통신 속도가 빨라서 실제 동작에서는 근소한 차이겠지만, 그래도 아주 간단하게 성능을 더 올릴 수 있는 방법을 알게되었다.
결론
병렬 실행이 필요하다면 flow { emit() } 을 사용하자
Stefan씨 어디서 보고계실지 모르겠는데 감사합니다👍 _from korea Joy