본문 바로가기

개발/RxSwift

[RxSwift] Conditional & Boolean Operators

반응형
 

ReactiveX - Operators

Introduction Each language-specific implementation of ReactiveX implements a set of operators. Although there is much overlap between implementations, there are also some operators that are only implemented in certain implementations. Also, each implementa

reactivex.io

 

Conditional & Boolean Operators 종류

  • Amb
  • Skip (skip:)
  • Skip (while:)
  • Take (Until:)
  • Take (while:)

 


 

Amb

amb

두 개 이상의 Observable이 제공된 경우, Observable 중 첫 번째 항목에서만 모든 항목을 내보내 항목 또는 알림을 보낸다.

여러 Observable을 Amb로 전달하면 해당 Observable 중 하나의 배출 및 알림을 전달한다.
첫 번째는 항목을 내보내거나 onError / onCompleted 알림을 보내 Amb에 알림을 보낸다.

 

 

Skip(until:) 

Skip(until:)

두 번째 Observable 이 지정된 항목을 방출 할 때까지 첫 번째 Observable이 방출한 항목을 버린다.

Skip은 Observable을 구독하지만, 두 번쨰 Observable이 항목을 방출할 때까지 Skip(until:)은
Observable을 미러링하기 시작할 때까지 방출을 무시한다.
위 다이어그램와 같이 두 번째 Observable에서 0 이라는 항목이 배출되기 전까지의 항목들은 모두 무시되는 것을 볼 수 있다.

let first = PublishSubject<String>()
let second = PublishSubject<String>()
let third = PublishSubject<Int>()

first
    .skip(until: second)
    .subscribe { print("skip(until:) : \($0)") }
    .disposed(by: disposedBag)

second
    .skip(until: third)
    .subscribe { print("skip : \($0)") }
    .disposed(by: disposedBag)

first.onNext("가")
first.onNext("나")
first.onNext("다")

second.onNext("A")
third.onNext(1)
second.onNext("B")

first.onNext("라")
first.onNext("마")
first.onNext("바")

second.onNext("C")
first.onNext("사")

// skip : next(B)
// skip(until:) : next(라)
// skip(until:) : next(마)
// skip(until:) : next(바)
// skip : next(C)
// skip(until:) : next(사)

 

 

Skip (while:)

Skip(while: )

Observable을 구독하지만 지정한 조건이 False가 될 때까지 배출을 무시한다.
이 시점에서 skip(while:)은 Observable을 미러링하기 시작한다.

Observable.of(1, 2, 3, 4)
    .skip(while: {$0 != 3} )
    .subscribe { print("skip(while:) : \($0)")}
    .disposed(by: disposedBag)
    
// skip(while:) : next(3)
// skip(while:) : next(4)
// skip(while:) : completed

 

 

Take (until:)

Take(until:)

Observable을 구독하고 미러링을 시작하며 제공하는 두 번째 Observable도 모니터링한다.
두 번째 Observable이 항목을 내보내거나 종료 알림을 보내는 경우 Take(until)에 의해 반한된 Observable은 미러링을 중지하고 종료한다.
Skip(until:) 과 반대의 개념이다.

let first = PublishSubject<String>()
let second = PublishSubject<String>()
let third = PublishSubject<Int>()

first
    .take(until: second)
    .subscribe { print("take(until:) : \($0)") }
    .disposed(by: disposedBag)

second
    .take(until: third)
    .subscribe { print("take : \($0)") }
    .disposed(by: disposedBag)

first.onNext("가")
first.onNext("나")
first.onNext("다")

second.onNext("A")
third.onNext(1)
second.onNext("B")

first.onNext("라")
first.onNext("마")
first.onNext("바")

second.onNext("C")
first.onNext("사")

// take(until:) : next(가)
// take(until:) : next(나)
// take(until:) : next(다)
// take(until:) : completed
// take : next(A)
// take : completed

 

 

Take (while:)

Take(while:)

지정한 조건이 false가 될 때까지 Observable을 미러링한다.
이 시점에서 Take(while:)은 Observable의 미러링을 중지하고 자체 Observable을 종료한다.

Observable.of(1, 2, 3, 4)
    .take(while: {$0 != 3} )
    .subscribe { print("take(while:) : \($0)")}
    .disposed(by: disposedBag)
    
// take(while:) : next(1)
// take(while:) : next(2)
// take(while:) : completed
반응형