Filtering Operator 의 종류
ignoreElements
- next 이벤트를 무시함
- completed, error 같은 정지이벤트는 허용함.
let publishSubject = PublishSubject<String>()
let disposeBag = DisposeBag()
publishSubject
.ignoreElements() // 모든 이벤트 무시
.subscribe({
print($0)
})
.disposed(by: disposeBag)
publishSubject.onNext("A")
publishSubject.onNext("B")
publishSubject.onNext("C")
publishSubject.onCompleted()
// A, B, C 는 출력되지 않고 무시됨
// onCompleted
elementAt
- 특정 인덱스에 해당하는 요소만 방출함, 나머지는 무시함. (Index 기준)
let publishSubject = PublishSubject<String>()
let disposeBag = DisposeBag()
publishSubject
.element(at: 2) //2번째 인덱스일때 방출
.subscribe(onNext: { element in
print(element)
}).disposed(by: disposeBag)
publishSubject.onNext("0")
publishSubject.onNext("1")
publishSubject.onNext("2")
// 1
filter
- 방출된 이벤트 중 클로저 내 조건에 맞는 이벤트만을 방출함.
- 방출된 이벤트가 filter 클로저 내 조건이 true일 때 이벤트 방출함.
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6, 7)
.filter { $0 % 2 == 0} // 2의 배수만을 방출
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// 2
// 4
// 6
skip
- 첫번째 요소를 기준으로 몇개의 요소를 스킵할건지에 대한 연산자임. (Count 기준)
let disposeBag = DisposeBag()
Observable.of("A", "B", "C", "D", "E", "F")
.skip(4) // 4번째 까지는 skip
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// E
// F
skipWhile
- while 클로저 안의 로직이 true일 때까지 무시한 후 방출.
- 즉, skipwhile 조건문이 false가 되는 시점의 element부터 방출함.
let disposeBag = DisposeBag()
Observable.of(2, 2, 3, 4, 4, 5)
.skip(while: { $0 % 2 == 0}) // 2의 배수가 아닌 시점부터 방출
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// 3
// 4
// 4
// 5
skipUntil
- 다른 Observable을 기준으로 다이나믹하게 필터하고 싶으면 skipUntil 사용함.
- 기준이 되는 Observable이 이벤트를 나타내기 전까지 요소들을 무시함.
- 기준이 되는 Observable은 Trigger라고도 함.
- 원본 Observable은 다른 Observable(Trigger)을 파라미터로 받음.
- 이 Trigger Observable가 Next 이벤트를 전달하기 전까지 원본 Observable이 전달하는 이벤트를 무시함.
- 파라미터로 전달하는 Observable을 Trigger 라고도 부름.
- Trigger Observable이 방출할 때까지 원본 observable에서 방출하는 이벤트를 skip함.
let disposeBag = DisposeBag()
let mainSubject = PublishSubject<String>()
let trigger = PublishSubject<String>()
mainSubject.skip(until: trigger)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
mainSubject.onNext("A") // 무시
mainSubject.onNext("B") // 무시
trigger.onNext("X") //트리거
mainSubject.onNext("C") // 방출
// C
take
- 첫번째 요소를 기준으로 몇개의 요소를 나타날건지에 대한 연산자임. (Count 기준)
- skip 연산자와 반대되는 개념.
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6)
.take(3)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 1
// 2
// 3
let subject = PublishSubject<Int>()
subject.take(2)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
subject.onNext(1)
subject.onNext(2)
subject.onNext(3)
// 1
// 2
takeWhile
- while 구문 내에서 true일 때까지 방출함. (false가 나타나기 전까지)
- skipWhile 연산자와 반대되는 개념.
let disposeBag = DisposeBag()
Observable.of(4, 2, 3, 4, 5, 6)
.take(while: {
return $0 % 2 == 0 // 2의 배수가 나타나는 시점 까지만 방출
}).subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 4
// 2
let subject = PublishSubject<Int>()
subject.take(while: {
return $0 % 2 == 0 // 2의 배수가 나타나는 시점 까지만 방출
}).subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
subject.onNext(0)
subject.onNext(2)
subject.onNext(4)
subject.onNext(1)
//0
//2
//4
takeUntil
- 다른 Observable을 기준으로 다이나믹하게 필터하고 싶으면 takeUntil 사용함.
- 기준이 되는 Observable이 이벤트를 나타내기 전까지 요소들을 나타냄.
- 기준이 되는 Observable은 Trigger라고도 함.
- 원본 Observable은 다른 Observable(Trigger)을 파라미터로 받음.
- 이 Trigger Observable가 Next 이벤트를 전달할 때까지 원본 Observable이 전달하는 이벤트를 방출함.
- 파라미터로 전달하는 Observable을 Trigger 라고도 부름.
- Trigger Observable이 방출할 때까지 원본 observable에서 방출하는 이벤트를 방출함.
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
subject.take(until: trigger)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
subject.onNext("1")
subject.onNext("2")
trigger.onNext("X")
subject.onNext("3")
// 1
// 2
enumerated
- 방출된 요소의 index를 참고하고 싶을때 사용
let disposeBag = DisposeBag()
Observable.of("1", "2", "3", "4", "5")
.enumerated() // 각 이벤트를 indexing 시킴.
.takeWhile {
$0.index < 3
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
distincUntilChanged
- 연달아 같은 요소가 이어질때 중복된 방출을 막아주는 역할
let disposeBag = DisposeBag()
Observable.of(1, 2, 2, 1, 3)
.distinctUntilChanged()
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 1
// 2
// 1
// 3
'rxSwift' 카테고리의 다른 글
[rxSwift] Combining Operator 의 종류 (0) | 2022.10.27 |
---|---|
[rxSwift] Transforming Operator 의 종류 (0) | 2022.10.23 |
[rxSwift] Subject 를 wrapping한 Relay 사용법 (0) | 2022.10.21 |
[rxSwift] Subject 에 대한 이해와 종류 (0) | 2022.10.21 |
[rxSwift] Dispose 는 왜 하는 걸까? (0) | 2022.10.20 |