본문 바로가기
안드로이드/Coroutine

Coroutine Flow

by 안드뽀개기 2023. 2. 13.
반응형

Flow

Coroutine의 suspend 함수는 비동기적으로 하나 값을 반환합니다. 그리고 지속적으로 혹은 한 번에 여러개의 값들을 반환하는 경우를 대응하기 위해서 Coroutine의 비동기 스트림 API flow를 사용합니다.

 

 

Coroutine Flow를 이용해서 연속적인 데이터 스트림을 구현하기 위해서는 Producer(생산자), Intermediary(중간 연산자), Consumer(소비자) 3가지가 필요합니다.

Producer

1. flow { } 블록 안에서 비동기로 동작

2. 날씨 정보를 서버로부터 받아온다.

3. Producer가 데이터를 방출한다.(emit)

4. 2~3번의 과정을 60초마다 반복한다.

 

Intermediary

1. Produce에서 생성한 값에서 필요한 형태변환한다.

2. 변환 연산자는 map(데이터 변형), filter(데이터 필터링), onEach(모든 데이터마다 연산 수행) 등이 있다.

 

Consumer

1.  소비자는 flow의 collect() 메소드를 이용하여 중간 연산자에서 변형된 데이터를 전달받을 수 있다.

2. 전달 받은 데이터를 Live Data, StateFlow 등을 이용하여 데이터의 상태를 업데이트 한다.

 

UI

1. 액티비티에서는 StateFlow 혹은 SharedFlow 등으로 업데이트 된 데이터를 전달받아서 UI를 갱신할 수 있다.


Flow의 Cancel

1. withTimeoutOrNull

withTimeoutOrNull을 이용하여 stream을 소비하는 측에서 timeout을 설정할 수 있습니다.

아래 코드에서는 11초 후 부터 collect { } 블럭 내부에 값이 들어오지 않습니다.

 

2. cancel()

cancle() 메소드를 이용하여 collect { } 블럭 내부에서 값을 수신하지 않도록 할 수 있습니다.

 

주의
이는 flow { } 빌더에서만 동작하고,

아래와 같이 asFlow같은 확장함수를 사용하는 경우는 동작하지 않는다고 합니다.


Flow 빌더

1. flow 

flow { }를 통해서 새로운 flow를 생성할 수 있다.

2. flowOf

flowOf 빌더는 정해진 값을 반복문을 돌려서 방출해준다.

3. asFlow

asFlow 코틀린 Collection이나 Sequence를 Flow로 변환하는 함수이다.


연산자

1. map

stream에서 흘러들어온 데이터를 변형할 때 사용하는 연산자

 

2. filter

filter는 filter { } 블럭 내부의 조건에 맞는 값만 내보내는 필터 함수입니다.

이와 반대로 조건에 맞지 않는 값만 내보내는 filterNot { } 함수가 있습니다.

 

3. onEach

onEach는 업스트림의 아이템들이 다운스트림으로 emit 되기전에 주어진 action을 처리하는 함수입니다.

 

4. transform 

transform은 업스트림에서 흘러들어온 아이템을 변형시켜서 방출하거나 아에 새로운 값을 방출할 수 있습니다. 또한 여러 개의 값을 방출할 수도 있습니다.

 

5. take

take는 몇 개의 값을 방출할 지 설정하는 함수 입니다.

 

6. drop

drop은 처음 몇개의 값을 방출하지 않을지 설정하는 함수입니다.

반응형