[flutter] - RxDart : Stream Classes Part1


Stream Classes

2가지 방법을 제공한다.

  • Stream 클레스를 직접 인스턴스화 하는 방법
    • Example :
      final mergedStream = MergeStream([myFirstStream, mySecondStream]);
      
  • Rx static factories를 사용하는 방법
    • Example :
      final mergedStream = Rx.merge([myFirstStream, mySecondStream]);
      

각 내용들을 하나씩 알아보자


ConcatStream / Rx.Concat

  • Example :
      ConcatStream([
      Stream.fromIterable([1]),
      TimerStream(2, Duration(days: 1)),
      Stream.fromIterable([3])
      ])
      .listen(print); // prints 1, 2, 3
    
      Rx.concat([
      Stream.value(1),
      Rx.timer(2, Duration(days: 1)),
      Stream.value(3)
      ])
      .listen(print); // prints 1, 2, 3
    

이미지

Concat은 여러개의 Steam을 합치며 그전 Stream이 끝나야 다음 Stream을 진행한다. 한번에 하나의 Streamsubscribing 진행


ConcatEagerStream / Rx.concatEager

Concat과 전반적인 내용은 같다 하지만 한번에 하나의 Streamsubscribing 진행하는게 아니라 한번에 모든 Streamsubscribing한다. 데이터 방출 순서는 똑같다.


DeferStream / Rx.defer

  • Example :

      DeferStream(() => Stream.value(1)).listen(print); //prints 1
    
      Rx.defer(() => Stream.value(1)).listen(print); //prints 1
    

DeferStreamsubscribing이 될때 까지 Stream생성을 기다린다.

기본적으로 단일 구독형이지만 재사용이 가능하다.


MergeStream / Rx.merge

  • Example :
      MergeStream([
      TimerStream(1, Duration(days: 10)),
      Stream.fromIterable([2])
      ]).listen(print); // prints 2, 1
    
      Rx.merge([
      Rx.timer(1, Duration(days: 10)),
      Stream.value(2)
      ]).listen(print); // prints 2, 1
    

이미지

Merge는 여러개 Stream을 하나의 Single Stream Sequence로 합친다. Concat과 다르게 다음 Stream을 기다리는게 아니라 말 그대로 합친다.


NeverStream / Rx.never

  • Example :

      NeverStream().listen(print); // Neither prints nor terminates
    
      Rx.never().listen(print); // Neither prints nor terminates
    

NeverStream은 아무런 값 없이 종료도 하지 않는 Stream입니다. 매우 제한적인 Stream이며 보통 Test용으로 사용됩니다.


RaceStream / Rx.race

  • Example :

      RaceStream([
      TimerStream(1, Duration(days: 1)),
      TimerStream(2, Duration(days: 2)),
      TimerStream(3, Duration(seconds: 3))
      ]).listen(print); // prints 3
    
      Rx.race([
      Rx.timer(1, Duration(days: 1)),
      Rx.timer(2, Duration(days: 2)),
      Rx.timer(3, Duration(seconds: 1))
      ]).listen(print); // prints 3
    

2번 Stream 선택 : 이미지

1번 Stream 선택 : 이미지

RaceStream은 여러개의 Stream중에서 가장 먼저 도착한 Stream을 출력한다. (나머지 스트림은 무시되는 듯하다.)

다음장에 이어서…