[RxSwift] Filtering Operator
2020. 4. 7. 17:20ㆍiOS/RxSwift
filtering Operator를 이용하면
.next이벤트에 조건부 제약 조건을 적용해 처리하고자 하는 요소만 받을 수 있도록 할 수 있다.
ignore
.next event는 무시한다.
.error이나 .complete는 전달한다.(종료되는 시점만 알 수 있음)
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
.ignoreElements()
.subscribe { _ in
print("[Subsscription is called]")
}.disposed(by: disposeBag)
strikes.onNext("A")
strikes.onNext("B")
strikes.onNext("C")
strikes.onCompleted()
// onCompleted를 하니까 프린트가 된다.(그 전에는 안됐음)
// [Subsscription is called]
ElementAt
-
발생하는 이벤트 중 n번째 이벤트만 받고싶을 때 사용한다.
-
인덱스는 0부터 시작한다는 것을 잊지 말자
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
.elementAt(2)
.subscribe(onNext: { value in
print("You are out! -> \(value)")
}).disposed(by: disposeBag)
strikes.onNext("a")
strikes.onNext("b")
strikes.onNext("c")
// You are out! -> c
Filter
- 조건에 맞는 값만 필터링하는 것이다.
Observable
.of(1,2,3,4,5,6,7)
.filter { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// 2,4,6
Skip
- 처음 발생하는 n개의 이벤트를 무시할 수 있다.
Observable
.of("A","B","C","D","E","F")
.skip(3)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// D, E, F
Skip While
- filter와 기능이 유사하다.
- filter는 통과 된 element를 전달하지만, skipWhile은 통과되지 못한 element를 전달한다.
- 한번이라도 조건을 만족하면 계속 element 전달
Observable
.of(2,2,3,4,4)
.skipWhile { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// 3, 4, 4
Skip Until
- trigger가 되는 시퀀스에서 이벤트가 발생하기 전까지 모든 이벤트가 skip된다.
let subject = PublishSubject()let trigger = PublishSubject()
subject.skipUntil(trigger).subscribe(onNext: {print($0)}).disposed(by: disposeBag)
subject.onNext("A")subject.onNext("B")
trigger.onNext("X")
subject.onNext("C")
take
- 처음 발생하는 n개의 이벤트만 받고 나머지는 무시
Observable
.of(1,2,3,4,5,6)
.take(3)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// 1,2,3
take While
- skip While과 유사
- 검사가 통과된 이벤트는 전달한다.
- 만약 통과하지 못한 이벤트가 있다면 그 이벤트와 이후 이벤트 모두 무시된다.
Observable
.of(2,4,6,8,9,10)
.takeWhile { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// 2,4,6,8
take Until
- skip Until과 유사
- trigger에 이벤트가 발생하면 이후 이벤트 모두 무시된다.
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
subject
.takeUntil(trigger)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
subject.onNext("1")
subject.onNext("2")
trigger.onNext("X")
subject.onNext("3")
// 1, 2
가만히 보고 있자니 해석하니 어떻게 사용해야 되는지 알 것 같다.
다만, 사용할 때 이게 갯수를 가리키는지 인덱스를 가리키는지 제대로 알고 써야되겠다.
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Combining Operator (0) | 2020.04.25 |
---|---|
[RxSwift] Transforming Operator (0) | 2020.04.18 |
[RxSwift] Observable & Subject (0) | 2020.04.02 |