[UniRx 입문 강좌 1] 개념 및 기본 사용법 소개
[UniRx 입문 강좌 2] UniRx 의 핵심, Subject 와 Observable 사용 방법
[UniRx 입문 강좌 3] IObserver 메세지 종류와 스트림의 수명 관리
[UniRx 입문 강좌 4] Operator 활용(1) - Where & Select & SelectMany 사용법
[UniRx 입문 강좌 6] 코루틴(Coroutine) 과 UniRx 연동
지난 강좌에서 UniRx 의 대표적인 오퍼레이터, Where 와 Select (그리고 SelectMany) 에 대해 알아 보았다.
이 두가지 오퍼레이터는 UniRx 구문을 10번 쓰면 그 중 7,8 번은 사용해야 할 정도로 자주 사용하는 오퍼레이터 이다.
하지만 우리가 원하는 복잡한 처리를 수행하려면 이것만으로는 턱도 없이 부족한 것이 사실이다.
실제로 다양한 처리의 자동화를 도와 주는 오퍼레이터 들이 UniRx에 이미 외우기 힘들 정도로 많이 만들어져 있다.
이번에는 그 많은 오퍼레이터 들 중에서도 사용빈도가 높은 것들 위주로 간단한 설명과 함께 정리해 보았으며 추후 각 오퍼레이터 별 상세 설명도 추가하겠다.
1. 팩토리 메소드
팩토리 메소드는 Observable 클래스에 팩토리 메소드 디자인 패턴 형태로 구현된 static 메소드 들이다.
주로 Observable 스트림의 값을 발행하고 컨트롤 하는 오퍼레이터 들이다.
Operator | 기능 | 비고 |
Observable.Create | 직접 Observable 객체를 생성한다. | |
Observable.Return | 1개의 메세지만 전달한다. | |
Observable.Repeat | 메세지의 전달을 반복한다. | |
Observable.Range | 지정된 수치의 메세지를 전달한다. | |
Observable.Timer / Observable.Interval |
일정 간격을 두고 메세지를 전달한다. |
Timer 는 실행 후 몇 초 이후 발생 Interval 은 실행 후 몇 초 마다 발생 |
Observable.Empty | OnCompleted를 즉시 전달한다. | |
Observable.FromEvent | UnityEvent 를 Observable 로 변환한다. | |
Observable.EveryUpdate / Observable.FixedEveryUpdate 그외 기타 등등... |
Update 이벤트 처럼 매프레임 메세지를 전달한다. |
OnCompleted 가 발행 되지 않으므로 수명 관리에 주의가 필요하다. 평상시에는 UpdateAsObservable 사용을 추천 |
2. 메세지 필터
메세지 필터는 스트림에 흐르는 메세지 들 중 원하는 메세지 들만 걸러내 주는 필터의 기능을 하는 오퍼레이터 들이다.
Operator | 기능 | 비고 |
Where | 조건식이 true 인 것만 통과 시킨다. | 다른 언어에서는 filter 의 기능 |
Distinct | 중복된 메세지 들은 제거한다. | |
DistinctUntilChanged | 값이 변화했을 경우만 통과 시킨다. | |
Throttle / ThrtottleFrame | 지정한 간격 내에 들어온 메세지 중 마지막 메세지만 통과 시킨다. | Throttle 과 ThrottleFrame 의 차이는 지정 조건이 시간인지 프레임인지 |
First / FirstOrDefault | 가장 먼저 발생한 메세지만 전달하고 Observable을 완료 시킨다. | |
Take | 지정한 갯수 만큼의 메세지만 전달. | |
TakeUntil | 인자로 지정한 스트림에 지정한 메세지가 올 때까지 계속 메세지를 전달한다. | |
TakeWhile | 조건이 true 인 동안 계속 메세지를 전달한다. | |
Skip | 지정한 갯수만큼 메세지를 스킵한다. | |
SkipUntil | 인자로 지정한 스트림에 지정한 메세지가 올 때까지 계속 메세지를 스킵한다. | |
SkipWhile | 조건이 true 인 동안 계속 메세지를 스킵한다. |
3. Observable 합성
Observable 의 스트림에 흐르는 메세지를 합성해 주는 오퍼레이터 들이다.
Operator | 기능 | 비고 |
Amb | 복수의 Observable 중에서 가장 빨리 메세지가 온 Observable 의 데이터를 선택한다. | |
Zip | 복수의 Observable 에 흐르는 메세지들을 합성한다. | 각 스트림 별로 1개씩 메세지를 뽑아서 합성한다. |
ZipLatest | 각 스트림 별로 1개씩 최신의 메세지만을 뽑아서 합성한다. | |
CombineLatest | 각 스트림 별로 1개씩 최신의 메세지만을 합성하되, 사용된 메세지는 다음 메세지가 도달하기 전까지 버리지 않고 재활용 된다. | |
WithLatestFrom | 2개의 Observable 중 하나를 주축으로 다른 Observable 의 최신값을 합성한다. | |
Merge | 복수의 Observable 을 1개의 스트림으로 합성한다. | |
Concat | 하나의 Observable에 OnCompleted 가 발생하여 종료되면 다른 Observable 로 대체한다. | |
SelectMany | 별도의 Observable을 생성하여 다른 Observable 을 대체한다. | 다른 언어에서는 FlatMap 의 기능 |
Observable.Catch | 복수의 Observable 을 성공할 때까지 차례로 실행한다. | Catch(IEnumerable<IObservable<T>>)을 사용하여 차례대로 성공할 때까지 1개씩 실행 |
4. Observable 변환
Observable 을 다른 형태로 변환시키는 Operator 들이다.
Operator | 기능 | 비고 |
ToReactiveProperty | Observable 을 ReactiveProperty 로 변화시킨다. | |
ToReadOnlyReactiveProperty | Observable 을 ReadOnlyReactiveProperty 로 변화시킨다. | |
ToYieldInstruction | Observable을 코루틴 으로 변환 시킨다 | OnCompleted 가 올때까지 코루틴 내에서 대기 시킬 수 있다. |
5. 메세지 합성과 연산
Observable 상의 메세지의 합성과 연산을 담당하는 Operator 들이다.
Operator | 기능 | 비고 |
Scan | 현재 메세지의 값과 이전 메세지 결과를 이용해 누적 처리를 반복한다. | LINQ 에서 Aggregate 의 기능ㅇ |
Buffer | 메세지를 지정한 갯수만큼 묶어서 전달한다. |
6. 메세지 변환
Observable 상의 메세지를 변환시키는 Operator 들이다.
Operator | 기능 | 비고 |
Select | 현재 스트림에서 처리하는 메세지를 다른 메세지로 대체한다. | 다른 언어에서 map 의 기능 |
Cast<T> | 메세지의 형변환 | |
TimeInterval | 이전 메세지로부터 경과시간을 부여한다. | |
TimeStamp | 메세지에 타임 스탬프를 추가한다. | |
AsUnitObservable | 메세지를 Unit 형으로 변환한다. | Select(_=>Unit.Default) 와 동일 |
7. Observable 완료시 처리
Observable 에 OnCompleted 전달 시 작동하는 Operator 들이다.
Operator | 기능 | 비고 |
Repeat | OnCompleted 전달 시 다시 한번 Subscribe 를 대기한다. | 무한 루프를 주의해야 한다. |
RepeatUntilDisable | OnCompleted 전달 시 다시 한번 Subscribe 를 대기하지만 지정한 GameObject 가 Disable 되면 Repeat 가 중지된다. | Repeat 보다 안전하다. |
RepeatUntilDestory | OnCompleted 전달 시 다시 한번 Subscribe 를 대기하지만 지정한 GameObject 가 Destory 되면 Repeat 가 중지된다. | Repeat 보다 안전하다. |
Finally | OnCompleted 나 OnError 전달 시 처리 |
[UniRx 입문 강좌 6] 코루틴(Coroutine) 과 UniRx 연동
댓글