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
- 메시지를 보낸 후, 일정 시간 들어오는 메시지들을 무시한다.
'🌍 Unity 연구 > UniRX' 카테고리의 다른 글
UniRX 배우기 7) MessageBroker 전역 옵저버 이벤트시스템 (0) | 2021.09.06 |
---|---|
UniRX 배우기 5) 코루틴과 함께 사용하기 (0) | 2021.04.29 |
UniRX 배우기 4) Hot, Cold Observable (0) | 2021.04.29 |
UniRX 배우기 3) 스트림의 구독과 종료시점 (0) | 2021.04.26 |
UniRX 배우기 2) Observable 객체 생성하기 (0) | 2021.04.25 |