Closed
Description
ignoreElements
- next이벤트를 무시한다.
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
.ignoreElements()
.subscribe({ _ in
print("You're out!")
})
.disposed(by: disposeBag)
strikes.onNext("X")
strikes.onNext("X")
strikes.onNext("X")
strikes.onCompleted() //이건만 출력됨
- onCompleted 때문에
You're out!
하나 출력
elementAt
- 배열 인덱스 처리처럼 방출된 n번째 요소만 사용하고자 할 때 사용 ( 0부터 시작)
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
.elementAt(2)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("3")
// 3 출력
- 2를 넣었으니 3번째 값 방출
filter
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5,6)
.filter { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 2
// 4
// 6 방출
- 필터링 요구사항이 한 가지 이상일 때 사용
skip
let disposeBag = DisposeBag()
Observable.of("A", "B", "C", "D", "E", "F")
.skip(3)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// D,E,F만 출력됨
skipWhile
let disposeBag = DisposeBag()
Observable.of(2, 2, 3, 4, 4)
.skipWhile { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 3, 4, 4 만 출력됨
skipUntil
- 다른 observable이 시동할 때까지 현재 observable에서 방출하는 이벤트를 skip
- 다른 observable이 .next이벤트를 방출하기 전까지는 기존 observable에서 방출하는 이벤트들을 무시하는 것
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("X")
subject.onNext("C")
// C만 출력됨
- skipUntil(
옵져버블타입
) 이러한 형태로 옵져버블타입이 들어간다. - 또는 skip(until:
옵져버블타입
)
take
let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5,6)
.take(3)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 1, 2, 3 만 출력됨
takeWhile
let disposeBag = DisposeBag()
Observable.of(2, 2, 3, 4, 4)
.takeWhile { $0 % 2 == 0 }
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 2, 2 만 출력됨
enumerated
- 방출된 요소의 index를 참고하고 싶은 경우가 있을 때, 사용
- 기존 Swift의 enumerated 메소드와 유사하게, Observable에서 나오는 각 요소의 index와 값을 포함하는 튜플을 생성
- 클로져에서 index로 접근 할 수 있다.
let disposeBag = DisposeBag()
Observable.of(2,2,4,4,6,6)
.enumerated()
.takeWhile { $0.index < 3 }
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// (index: 0, element: 2)
// (index: 1, element: 2)
// (index: 2, element: 4) 출력
Observable.of(2,2,4,4,6,6)
.enumerated()
.takeWhile({ index, value in
value % 2 == 0 && index < 3
})
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 2, 2, 4 출력
- 위의 예시 둘 처럼 사용 가능하다 참고!
takeUntil
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("X")
subject.onNext("3")
// 1, 2만 출력됨
distinctUntilChanged
그림에서처럼
distinctUntilChanged
는 연달아 같은 값이 이어질 때 중복된 값을 막아주는 역할을 한다.
2
는 연달아 두 번 반복되었으므로 뒤에 나온2
가 배출되지 않았다.
1
은 중복이긴 하지만 연달아 반복된 것이 아니므로 그대로 배출된다.
let disposeBag = DisposeBag()
Observable.of("A", "A", "B", "B", "A")
.distinctUntilChanged()
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// A, B, A 출력
- 연달아만 아니면 된다.
distinctUntilChanged(_:)
- distinctUntilChanged는 기본적으로 구현된 로직에 따라 같음
- 커스텀한 비교로직을 구현하고 싶을 때 사용
- 그림처럼 클로져를 통해 비교가 가능 한 것.
Activity