UniRX 배우기 6) UniRX 오퍼레이터

ReactiveX코리아
http://reactivex.io/documentation/ko/operators

 

 

오퍼레이터

 - 스트림의 메시지들에 조건을 걸어 필터하거나 가공하는 메소드.

 - 스트림은 오퍼레이터를 통해 이벤트의 투영, 필터링, 합성이 가능하다.

 - Where, Select와 같이 LINQ에 존재하는 오퍼레이터와 동일한 오퍼레이터도 존재한다.

 

1. 팩토리 메서드

오퍼레이터 기능
Observable.Create 직접 메시지 발행이 가능한 객체를 생산한다.
Observable.Return 메시지 1개를 발행한다.
Observable.FromEvent 이벤트를 Observable로 변환한다.
Observable.Timer 특정 시간 이후에 메시지를 배출한다.
Observable.TimerFrame 특정 프레임 이후에 메시지를 배출한다.
Observable.Interval 특정 시간마다 연속된 정수형을 배출한다.
Observable.Range 연속된 범위의 정수를 발행한다.
Observable.Repeat 특정 항목을 반복적으로 배출한다.
Observable.EveryUpdate Update마다 메시지를 발행한다.
Observable.Empty 메시지 생성없이 바로 OnCompleted가 호출된다. 
Observable.Never 메시지도 생성하지 않으며 종료되지 않는다.



2. 메시지 필터

오퍼레이터 기능
Where 조건을 만족시키는 값만 통과시킨다.
Distinct 중복 값은 무시한다. (한 번 통과했던 값의 메시지는 무시한다)
DistinctUntilChanged 값이 변할때만 배출한다.
First / FirstOrDefault 맨 첫번째 혹은 조건을 만족하는 첫번째 값만 배출한다.
Take 처음 도달한 n개의 값들만 배출한다.
TakeUntil 지정한 스트림이 메시지를 받을때까지 배출한다.
TakeWhile 조건이 true인 동안 메시지를 배출한다.
Skip 처음 n개의 항목들을 무시한다.
SkipUntil 지정한 스트림이 메시지를 받을때까지 무시한다.
SkipWhile 조건이 true인 동안 메시지를 무시한다.
더보기

Where

 - 조건을 만족하는 메시지만 통과시킨다. (filter)

 - 예시 : 매 Update 중에서 마우스를 클릭한 프레임일 때만 메시지를 발행하기

Observable.EveryUpdate()
    .Where(_ => Input.GetMouseButtonDown(0))
    .Subscribe(_ => Debug.Log("마우스 클릭"));

 

 

Distinct

 - 중복 값은 무시한다. (한 번 통과했던 값의 메시지는 무시한다)

 

 

DistinctUntilChanged

 - 값이 변할때만 배출한다.

 

 

SkipUntil

 - 지정한 스트림에 메시지가 올 때까지 메시지를 무시한다.

 

 

TakeUntil

 - 지정한 스트림에 메시지가 오면, 자신의 스트림에 OnCompleted를 보내서 종료한다.

 

 

 

3. Observable 합성

오퍼레이터 기능
Amb 두 개 이상의 소스 Observable이 주어 질때, 그 중 첫 번째로 항목을 배출한 Observable이 배출하는 항목들을 전달
Zip 명시한 함수를 통해 여러 Observable들이 배출한 항목들을 결합하고 함수의 실행 결과를 배출 (도달 순서대로 1:1 대응 되게 결합된다.)
ZipLatest Zip과 동일하지만 양쪽에서에서 배출된 항목이 되응되는 시점에 가장 최신 메시지 끼리 결합 (한쪽에서 두번 메시지가 오면 앞은 무시)  
CombineLatest 두 개의 Observable 중 하나가 항목을 배출할 때 배출된 마지막 항목과 다른 한 Observable이 배출한 항목을 결합한 후 함수를 적용하여 실행 후 실행된 결과를 배출
WithLatestFrom 두 개의 Observable 중 하나를 기준으로, 다른 Observable의 최신 값을 결합
Merge 복수 개의 Observable들이 배출하는 값들을 하나의 Observable로 생성
Concat 지정한 Observable이 OnComplete될 때, 다른 Observable에 연결
SelectMany 별도의 Observable을 생성하고, 기존값을 사용하여 메시지를 배출
더보기

Zip

 - 명시한 함수를 통해 여러 Observable들이 배출한 항목들을 결합하고 함수의 실행 결과를 배출

   (도달 순서대로 1:1 대응 되게 결합된다.)

 

 - 예시 : A버튼과 B버튼이 둘다 눌리면 함수 호출하기

var ob = button2.OnClickAsObservable();

button1
    .OnClickAsObservable()
    .Zip(ob, (b1, b2) => "")
    .First() //
    .Repeat() // 1번 동작 후 Zip 내의 버퍼를 클리어한다.
    .Subscribe(_ => Test());

 

 

 

SelectMany

 - 새로운 스트림을 생성하고, 그 스트림이 흐르는 메시지를 본래의 스트림 메시지로 취급

 

 

 

4. 메시지 변환

오퍼레이터 기능
Select 값을 변경 (함수를 적용하거나, 다른 값으로 바꾸거나 등)
Cast 형식 변환
더보기

Select

 - 요소의 값을 변경한다 (map)

 - 예시 : 매 Update 중에서 마우스 클릭한 프레임일때, 마우스의 위치를 메시지 보내서 출력하기

Observable.EveryUpdate()
    .Where(_ => Input.GetMouseButtonDown(0))
    .Select(_ => Input.mousePosition)
    .Subscribe(n => Debug.Log($"마우스 클릭 위치 {n}"));

 

 

 

 

5. 메시지 지연, 대기

오퍼레이터 기능
Buffer 1. 메시지가 일정 개수에 도달하면 호출
2. 지정한 Observable에 메시지가 도달하면 호출 
Delay / DelayFrame 메시지의 전달을 특정 시간만큼 지연
Timeout Subscribe 하고 일정시간 이상 OnNext가 도달하지 않으면 OnError를 발행
Throttle / ThrottleFrame 시간이나 프레임이 경과하였을때, 그 동안 들어온 메시지들 중 마지막 메시지를 보낸다.
ThrottleFirst / ThrottleFirstFrame 배출한 뒤에는, 일정 시간 들어오는 메시지들을 무시한다.
더보기

Buffer

 - 메시지를 조건에 따라 병합하여 대기하였다가 보낼 수 있다.

1. n번 호출될 때 보내기
2. 다른 스트림에 메시지가 흐르면, 보내기

 - 예시 : 버튼이 3회 눌리면 텍스트 표기하기

button
    .OnClickAsObservable()
    .Buffer(3)
    .SubscribeToText(text, _ => "눌렀다");


Delay/DelayFrame

 - 메시지의 전달을 특정 시간만큼 지연시킨다.

 

Throttle / ThrottleFrame

 - 시간이나 프레임이 경과하였을때, 그 동안 들어온 메시지들 중 마지막 메시지를 보낸다.

 - 마지막 이외를 무시한다. (debounce)

 

ThrottleFirst/ThrottleFirstFrame

 - 메시지를 보낸 후, 일정 시간 들어오는 메시지들을 무시한다.

 

 

 

댓글

Designed by JB FACTORY