필터링 연산자 종류에는
Ignore
Element At
Filter
Skip
SkipWhile
SkipUntil
Take
TakeWhile
TakeUntil
이 있는데 하나씩 예제를 들어가며 살펴보자
Ignore
1-2-3의 sequence에서
ignoireElements()를 사용하면 next는 무시된다.
단, Oncompleted나 , error등의 event에는 trigger가 된다.
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes.ignoreElements().subscribe { _ in
print("[Subscription is called]")
}.disposed(by: disposeBag)
strikes.onNext("A")
strikes.onNext("B")
strikes.onNext("C")
이상태로 코드 진행하면 호출되는 것이 없다.
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes.ignoreElements().subscribe { _ in
print("[Subscription is called]")
}.disposed(by: disposeBag)
strikes.onNext("A")
strikes.onNext("B")
strikes.onNext("C")
strikes.onCompleted()
onCompleted()에 호출된 것을 알 수 있다.
ElementAt
elementAt(indexnumber)로 인덱스에서 나온 것을 제외하고는 모두 무시한다.
let strikes = PublishSubject<String>()
let disposebag = DisposeBag()
strikes.elementAt(2) // indexnumber
.subscribe(onNext: { _ in print("U are fired")
}).disposed(by: disposeBag)
strikes.onNext("A") // indexnumber0
strikes.onNext("B") // indexnumber1
strikes.onNext("X") // indexnumber2
strikes.onNext("Y") // indexnumber3
strikes.onNext("C") // indexnumber4
indexnumber2를 제외하고는 모두 무시된 것을 알 수 있다.
Filter
1-2-3-4-5 sequence가 있다면,
filter { $0 < 5 }로 필터링하게 되면
1,2,3,4의 sequence값을 얻을 수 있다.
let strikes = PublishSubject<String>()
let disposebag = DisposeBag()
Observable.of(0,1,2,3,4,5,6,7)
.filter { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposebag)
Skip
1-2-3의 sequence가 있을 때
skip(2)를 이용하면
indexnumber1,2를 건너 뛰고
3의 sequence를 얻을 수 있다.
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
Observable.of("A","B","C","D","E","F")
.skip(3)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
SkipWhile
조건이 만족할 때까지는 skip을 하고 조건이 깨지는 순간부터 subscribe한다.
1-2-3-4 sequence가 있을 때
skipWhile { $0 % 2 ==1 }
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
Observable.of(2,2,3,4,4,5,6)
.skipWhile { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
SkipUntil
1-2-3 sequence가 있다고 가정할 때
trigger가 될 때까지는 skip하고 trigger 이후의 값을 subscribe한다.
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
subject.skipUntil(trigger)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
subject.onNext("A")
subject.onNext("B")
trigger.onNext("C")
subject.onNext("D")
subject.onNext("E")
A,B까지는 출력이 안되고
C가 트리거 되고 난 이후의 값인 D,E값이 출력됨을 알 수 있다.
Take
1-2-3 sequence가 있다고 가정할 때 take(2)로 하면 인자로 받은 수 만큼 subscribe하고 나머지는 무시한다.
(skip과 반대되는 개념)
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5,6,7)
.take(3)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
3개만 취하고 나머지는 무시한다.
TakeWhile
조건에 맞을 때 까지 취하고 조건이 깨지면 버린다.
skipwhile과 반대되는 개념
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
Observable.of(2,4,6,7,8,10)
.takeWhile{
$0 % 2 == 0
}.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
조건에 맞는 2,4,6만 출력하고 깨진 뒤로는 무시한 것을 알 수 있다.
Take Until
trigger되기 전까지 구독하고 나머지는 무시한다.
skipUntil과 반대되는 개념
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
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("3")
subject.onNext("4")
subject.onNext("5")
subject.onNext("6")
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Combining Operators (1) | 2022.11.02 |
---|---|
[RxSwift] Transforming Operator(ToArray, Map, FlatMap, FlatMapLatest) (0) | 2022.11.01 |
[RxSwift] Subject에 관하여 (0) | 2022.10.25 |
[RxSwift] Observable, Dispose, Create로 subscribe하기 (0) | 2022.10.25 |