파파비의 블로그

Flutter) "Rxdart" - 스트림을 더 쉽게, 유용하게 본문

개발/flutter

Flutter) "Rxdart" - 스트림을 더 쉽게, 유용하게

N. Dave 2020. 8. 3. 19:24
반응형

1) 스트림이란?

- 큰 Data를 잘게 나누어서 한번에 다 다운받지 않고도 data를 받아서 사용이 가능하다.

- 유튜브 영상이나 동영상 강의 같은 것들을 생각하면 된다.

 

2) 플러터에도 Stream이 사용되는데, 약간 결이 다른 것 같다. (다운로드 같은건 아니니까..)

- 먼저 스트림은 data가 날라오면 구독자들에게 알리는 역할을 한다. 알리면서 당연히 해당 data도 전달한다.

- SteamController 라는 객체를 만들면, Stream이 형성되고, 이 Stream을 통제할 수 있는 Controller도 같이 나온다.

- (SteamController 객체를 stream이라고 부르겠다) stream.listen하고 인수로 함수를 넣으면, steam을 통해 어떤 data가 전달되었을 때, 바로 그 메소드가 실행된다. 해당 메소드에는 인수로 stream에서 얻은 data를 controll할 수 있다.

 

3) dart에서 제공되는 StreamController 객체와 & StreamController.broadcast 객체

- 이둘은 dart에서 제공하는데 차이점이 있다. StreamController는 listen(리스너)를 한번만 설정할 수 있다.

즉 리스너를 하나만 달 수 있다.

- StreamController.broadcast는 리스너를 여러개 달아도 상관 없다.

 

4) 그렇다면 스트림을 통해 data를 어떻게 전달할까?

stream.stream.add()를 통해 가능하다. add뒤에 인수로 data가 들어간다. 그리고 앞의 stream은 StreamController 의 객체이름이고, 뒤에는 진짜 stream을 의미한다.

 

5) RxDart는 무엇인가? 이런 Stream에 관한 것들을 더 쉽게 다루게 하기 위해, 추가적인 method들과 함께 제공해주는 패키지, 플러그인이라고 할 수 있다.

 

6) RxDart에는 3가지 stream객체가 존재한다. 

 - PublishSubject<T> 객체, BehaviorSubject<T> 객체, ReplaySubject<T> 객체

 - T는 전달하려는, stream되는 data의 타입을 의미한다.

 - 이들은 기본적으로  StreamController.broadcast 객체들이다. 따라서 여러개의 리스너를 담을 수 있다.

 - 이들의 차이점은

   1) PublishSubject은 리스너를 추가하면 해당 리스너는 그 이후의 stream data에 대해서만 반응한다. 

   2) BehaviorSubject는 추가되기 직전 하나의 data를 포함하여 그 이후의 stream data에 대해 반응한다.

   3) ReplaySubject는 맨 처음 data부터 전부 다 반응한다.

 

반응한다는 것은 listen에 넣어진 함수가 실행된다는 뜻이다.

(리스너가 반응하는 것이다).

 

7) RxDart에는 유용한 메소드가 있다. map이다.

event에 대해서 (event는 받은 data를 의미한다.) 변형을 바로 할 수 있다.

또한 이 map함수는 chain이 가능해서 map을 여러번 통해서 가공을 정교하게 할 수 있다.

subject는 streamcontroller 객체인데, listen하기 전에 event를 가공하는 모습이다.

이렇게 한다.

 

추가적으로 where, scan 등이 있다.

- where은 true가 return되면 listen하고, 그렇지 않으면 listen하지 않는다.

- scan은 이전 값을 활용할 수 있다

여기서 예시에서는 들어온 값들의 합을 나타내고 있다.

- asyncMap도 있는데 이건 그냥 map과 똑같은데, 비동기형식으로 지원되며, async작업들을 처리할 수도 있다.

- debounceTime 도 있는데 여기에는 인수로 시간이 들어가고, 이 시간 이후부터 data를 받게된다. 따라서 그 전에 들어오는 data들은 전부 무시된다.(리스너가 반응X)

- buffercount로 버퍼를 설정할 수도 있는데 2라고 설정하면 한번에 2개의 data가 날라온다.

 

- distinctUnique 는 동일한값이 연속해서 오면 하나의 값만 보여주고 중복되는 값은 무시한다.

 

그 이외에도 사용할 수 있는 method들은 너무나도 많다.

잘 알아보면 웬만한 것들은 다 있을 것이다.

 

 

사실 stream객체가 더 있는데 이것들은 좀 특이하다.

RangeStream, TimeStream같은게 있는데,

Range의 경우 범위 값을 넣으면 그냥 그게 그 자리에서 add되는 것이다.

TimeStream은 일정 시간 이후에 add가 된다.

사용은 안해봐서 정확히는 모르지만,

나중에 혹시 필요하면 그때 자세히 알아보자

 

 

8) flutter에서 future들은 stream으로 바꿀 수 있다.

asStream 메소드를 사용하면 된다.

 

9) mergewith / zipwith / concatewith 등을 활용하면 여러개의 stream을 하나의 stream으로 합쳐서 관리할 수 있다.

 

 

https://rxmarbles.com/

 

RxMarbles: Interactive diagrams of Rx Observables

 

rxmarbles.com

 

여기는 rx에 대해서 그래프로 이해할 수 있는 곳이다. 참고바람

 

 

 

 

반응형
Comments