Operator는 Observable에서 방출 된 이벤트를 변환하는 기능을 가지고 있다.
Operator는 크게 세가지로 구분된다.
- Filtering Operator
- Transforming Operator
- Combining Operator
Filtering Operator
Filtering Operator는 .next 이벤트를 통해 전달 받은 값을 필터링 하는 기능을 가진 Operator이다.
.filter

- .filter(조건식)을 넣어 조건식에 만족하는 이벤트만 방출하게 된다.
.skip

- .skip(n)을 넣어 n개의 이벤트를 무시하는 기능을 한다.
.skipWhile

- .skipWhile(조건식)을 넣어 조건식이 만족하는 이벤트부터 방출하게 된다.
.take

- .take(n)을 넣어 n개의 이벤트만 방출하고 complete 된다.
.takeWhile

- .takeWhile(조건식)을 넣어 조건식이 만족하는 이벤트만 방출하고 조건식을 만족하지 않으면 complete 된다.
.distinctUntilChanged

- .distinctUntilChanged()는 연달아 같은 값으로 이벤트가 발생 될 때 중복 된 값은 방출하지 않도록 하는 기능이다.
.throttle(:scheduler)

- .throttle(.seconds(1), latest: false, scheduler: MainScheduler.instance) 는 특정 시간 동안 방출하는 이벤트를 한번만 발생하게 해 준다. 하지만 latest 값을 true로 설정하면 특정 시간 동안 방출을 막아주지만 마지막 이벤트는 방출하게 된다. (버튼의 중복 탭 이벤트를 막기 위해 유용하게 쓰일 듯)
. debounce

- .debounce(.seconds(1), scheduler: MainScheduler.instance)는 특정 시간이 지난 후 마지막 이벤트를 한번만 발생하게 해 준다. 이벤트 발생과 동시에 시간은 다시 초기화 된다. (searchbar 입력 시 유용하게 쓰일 듯)
Transforming Operators
Observable을 변경하는 Operator이다.
.map

- 이벤트를 다른 이벤트로 변형한다.
- Swift의 map과 동일한 기능을 한다.
Observable.of(1, 2, 3) .map { $0 * 10 } .subscribe(onNext: { print($0) }) .disposed(by: self.disposeBag)
- 위 예제는 1, 2, 3 이벤트 값은 .map 수식에 의해 10, 20, 30으로 전달 된다.
.flatMap

- Observable을 새로운 Observable로 변경하여 이벤트로 전달 한다.
let valueSubject = PublishSubject<Int>()
valueSubject.flatMap{
BehaviorSubject<Int>(value: $0)
}
.subscribe(onNext: {
print($0)
})
.disposed(by: self.disposeBag)
- PublishSubject를 BehaviorSubject로 변형하여 이벤트를 방출한 예제이다.
.flatMapLatest()

- flatMap에서 가장 최신의 값을 다른 Observable로 변형하여 이벤트 방출을 한다. 이전 Observable은 자동적으로 구독이 취소 된다.
.flatMapFirst()
- .flatMapLatest와 반대로 이전에 생성한 Observable 동작이 끝날 때까지 새로 생성 된 Observable은 이벤트를 방출하지 않는다.
Combining Operators
이벤트를 모으고 병합 및 조합하는 Operator이다.
.concat()

- 하나의 Observable의 이벤트가 종료 되면 그 뒤에 다른 Observable의 이벤트를 연결 시켜 준다.
- 즉, Observable의 이벤트를 일렬로 병합 해 주는 Operator이다.
.merge()

- 각각의 Observable의 이벤트 발생 순서에 따라 병합 시켜 주는 Operator이다.
.combineLatest()

- Observable의 마지막 이벤트끼리 병합이 이루어 질 때 방출하는 Operator이다.
.zip()

- Observable의 이벤트가 쌍이 이루어 질 때만 방출하는 Operator이다.
.withLatestFrom()

- 한쪽 Observable의 마지막 이벤트와 병합을 시켜주는 Operator이다.
- 기준이 되는 Observable의 이벤트가 발생하지 않으면 병합이 이루어 지지 않는다.
.scan()

- 값을 저장하거나 그 값을 통해 이벤트를 변형하는 Operator이다.
- 이벤트 변형이 되지만 Observable 타입은 동일해야 한다.
개인적으로 공부하면서 정리 한 내용이라 틀린 내용이 있을 수 있습니다..