RxSwift – Operator

ignoreElements
subscribe시 Completed 와 Error 만 전달됩니다. 주로 작업의 성공과 실패에 대한 정보가 필요할만 사용합니다.

 let ignoreElements = PublishSubject<String>()
ignoreElements.ignoreElements()
.subscribe(onCompleted: {
     print("onCompleted")
}, onError: { error in
     print(error)
}).disposed(by: disposeBag)

ignoreElements.onNext("1")
ignoreElements.onNext("2")
ignoreElements.onCompleted()

//로그

onCompleted

elementAt
지정된 index의 값만 방출하고 완료됩니다.

let elementAt = PublishSubject<String>()
elementAt.elementAt(1)
.subscribe(onNext: { value in
     print(value)
}).disposed(by:disposeBag)

elementAt.onNext("1")
elementAt.onNext("2")
elementAt.onNext("3")

// 로그
2

filter
조건에 해당하는 element 만 방출합니다

Observable.of(1, 2, 3, 4, 5)
.filter { $0 % 2 == 0 }
.subscribe {
print($0)
}.disposed(by: disposeBag)

// 로그
next(2)
next(4)
next(6)
completed

skip
정수로 지정한 수 만큼 스킵하고 이 후 부터의 값을 방출합니다.(index 가 아님)

Observable.of(1, 2, 3, 4, 5)
.skip(2)
.subscribe {
print($0)
}.disposed(by:disposeBag)

next(3)
next(4)
next(5)
completed

skipWhile
조건 값이 true 인 element 는 무시하고 ,false 인 element 부터 방출을 합니다. 조건이 false 인 element 부터는 조건에 관계없이 이 후의 모든 element 가 방출됩니다.

Observable.of(1, 2, 3, 4, 5, 6, 1)
.skipWhile { $0 < 5 }
.subscribe {
print($0)
}.disposed(by:disposeBag)

next(5)
next(6)
next(1)
completed

skipUntil
트리거 이벤트가 발생하기 전까지 모든 이벤트를 무시합니다.

let subject = PublishSubject<String>()
let trigger = PublishSubject<Void>()
subject.skipUntil(trigger)
.subscribe {
print($0)
}.disposed(by:disposeBag)

subject.onNext("1")
trigger.onNext(())
subject.onNext("2")
subject.onNext("3")

//로그
next(2)
next(3)

take
앞 n개의 element 만 방출

Observable.of(1, 2, 3, 4, 5)
.take(3)
.subscribe { print($0) }
.disposed(by: disposeBag)

next(1)
next(2)
next(3)
completed

takeWhile
조건이 true 인 경우 까지만 element 를 방출합니다. 조건이 false 인 경우가 발생하면 더이상 element 를 방출하지 않습니다.

Observable.of(1, 3, 5, 7, 9, 2, 4, 6)
.takeWhile { $0 < 5 }
.subscribe { print($0) }
.disposed(by: disposeBag)

next(1)
next(3)
completed

takeUntil
트리거 이벤트가 발생 하기 전까지만 방출됩니다.

let subject = PublishSubject<String>()
let trigger = PublishSubject<Void>()
subject.takeUntil(trigger)
.subscribe { print($0) }
.disposed(by: disposeBag)

subject.onNext("A")
subject.onNext("B")
trigger.onNext(())
subject.onNext("C")

next(A)
next(B)
completed

takeLast
Completed 이벤트가 전달될때 지정된 정수만큼의 element 를 방출합니다. 반면 Error 이벤트가 전달되면 버퍼에 있는 element를 전달하지 않고 종료됩니다.

let numbers = [1, 2, 3, 4, 5, 6]
let subject = PublishSubject<Int>()
subject.takeLast(2)
.subscribe { print($0) }
.disposed(by: disposeBag)

numbers.forEach { subject.onNext($0) }
subject.onCompleted()

next(5)
next(6)
completed

single
Observable에서 첫번째 element만 방출하거나 조건과 일치하는 첫번째 element 만 방출합니다. 단 하나의 element 가 방출되어야 정상으로 completed 됩니다. element 를 방출하지 않거나 두개 이상의 element 를 방출하면 Error 이벤트가 전달됩니다.

Observable.from([1, 2, 3, 4, 5])
.single { $0 % 2 == 0 }
.subscribe { print($0) }
.disposed(by: disposeBag)

next(2)
error(Sequence contains more than one element.)

distinctUntilChanged
동일한 element 가 연속적으로 방출되지 않도록 하는 연산자 입니다. 원본 observerble 에서 전달되는 요소를 순서대로 비교한 후 바로 이전 요소와 동일하다면 방출하지 않습니다.

Observable.from([1, 1, 2, 2, 3, 4, 1, 2])
.distinctUntilChanged()
.subscribe { print($0) }
.disposed(by: disposeBag)

next(1)
next(2)
next(3)
next(4)
next(1)
next(5)
completed

Throttle

– 타이머를 지정해두고 이벤트가 처음 방출되면 타이머 동안 어떤 이벤트도 방출되지 않는다. 
– 이벤트가 방출될때마다 타이머가 초기화되지 않는다. 
– 사용예제: 타이머를 2초로 지정해두면, 사용자가 버튼을 폭풍 누를때 처음 클릭 이벤트만 주고 2초동안 어떠한 클릭이벤트도 주지 않는다.

let tap = PublishSubject<String>()
tap.throttle(.milliseconds(500), scheduler: MainScheduler.instance)
.subscribe { print($0) }
.disposed(by: disposeBag)

tap.onNext("1")
tap.onNext("2")

1

Debounce

– 타이머를 지정해두고 타이머가 끝난 시점에 가장 최근의 값을 방출해준다. 
– 이벤트가 방출될때마다 타이머가 초기화된다. 
– 사용예제: 타이머를 2초로 지정해두면, 사용자가 버튼을 폭풍 누르다가 더이상 버튼을 안누르고 2초가 지날때 가장 마지막 클릭 이벤트를 준다. 

let btn = PublishSubject<String>()
        btn.debounce(.milliseconds(500), scheduler: MainScheduler.instance)
            .subscribe {
                print($0)
            }
        btn.onNext("1")
        btn.onNext("2")
        btn.onNext("3")

        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            print("-----")
            btn.onNext("4")
            btn.disposed(by: self.rx.disposeBag)
        }

next(3)
-----
next(4)

에 발행했습니다
RXSWIFT(으)로 분류되었습니다

aaron님이 작성

아무것도 안해도 시간은 흐른다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다