Tunko Development Diary

RxSwift) Transforming Operators(withLatestFrom, sample, switchLatest) 본문

Development/RxSwift

RxSwift) Transforming Operators(withLatestFrom, sample, switchLatest)

Tunko 2022. 6. 6. 02:55

withLatestFrom

withLatestFrom 은

트리거옵저버블.withLatestFrom(데이터옵저버블)

트리거옵저버블.withLatestFrom(데이터옵저버블) 형태로 사용됩니다.

let disposeBag = DisposeBag()

enum TunkoError: Error {
   case error
}

let 트리거서브젝트 = PublishSubject<Void>()
let 데이터서브젝트 = PublishSubject<String>()

트리거서브젝트.withLatestFrom(데이터서브젝트)
    .subscribe{ print($0) }
    .disposed(by: disposeBag)

데이터서브젝트.onNext("데이터")
트리거서브젝트.onNext(())
트리거서브젝트.onNext(())

데이터서브젝트.onCompleted()
//데이터서브젝트.onError(TunkoError.error)
트리거서브젝트.onNext(())

출력

next(데이터)
next(데이터)
next(데이터)

트리거 옵저버블에서 Next 이벤트가 발생하면 데이터 옵저버블에서 발생한 가장 최근 Next이벤트가 방출됩니다.

화면에서 버튼을 눌렀을떄 문자열을 가져오거나 할때 사용하기 좋습니다. 트리거 옵저버블에서 반복해서 이벤트를 전달하면 반복해서 나옵니다.

데이터 서브젝트를 완료하면 가지고있던 마지막 next 이벤트를 가져옵니다. 데이터 서브젝트에서 에러이벤트를 전달하면 마지막 next 이벤트를 생략하고 에러가 나옵니다.

sample

sample 연산자는 withLatestFrom 와 거의 동일합니다. 트리거옵저버블에서 이벤트가 방출되면 대상옵저버블이 이벤트를 방출합니다.

차이점은 같은 데이터를 연속해서 방출하지 않습니다. 완료시 마지막 남은 데이터를 방출하지 않고 Completed이벤트를 방출합니다.

let disposeBag = DisposeBag()

enum TunkoError: Error {
   case error
}
let 트리거서브젝트 = PublishSubject<Void>()
let 데이터서브젝트 = PublishSubject<String>()

데이터서브젝트.sample(트리거서브젝트)
    .subscribe{ print($0) }
    .disposed(by: disposeBag)

데이터서브젝트.onNext("데이터")
트리거서브젝트.onNext(())
트리거서브젝트.onNext(()) // 무시
트리거서브젝트.onNext(()) // 무시
데이터서브젝트.onNext("데이터변경")
트리거서브젝트.onNext(()) // 방출
데이터서브젝트.onCompleted()
트리거서브젝트.onNext(()) // 방출

출력

next(데이터)
next(데이터변경)
completed

switchLatest

가장 최근 옵저버블이 방출하는 이벤트를 구독자에게 방출합니다. switchLatest는 파라미터가 없습니다. 주로 옵저버블을 방출하는 옵저버블로 사용합니다.

let disposeBag = DisposeBag()

enum TunkoError: Error {
   case error
}

let a = PublishSubject<String>()
let b = PublishSubject<String>()

// 문자열을 방출하는 옵저버블을 방출하는 서브젝트
let subject = PublishSubject<Observable<String>>()

subject
    .switchLatest()
    .subscribe { print($0) }
    .disposed(by: disposeBag)

a.onNext("a")
b.onNext("b")

subject.onNext(a)

a.onNext("a2")

b.onNext("b2")

subject.onNext(b)

b.onNext("b3")

a.onCompleted() // 무시됨
b.onCompleted() // 무시됨

subject.onCompleted() // 완료!
//b.onError(TunkoError.error) 

출력

next(a2)
next(b3)
completed

가장 최근 옵저버블이 방출하는 이벤트를 구독자에게 방출합니다. switchLatest는 파라미터가 없습니다. 주로 옵저버블을 방출하는 옵저버블로 사용합니다.

하지만 Error는 subject에 최신 옵저버블인 B에서 Error이벤트가 발생하면 Error를 방출합니다.

반응형
Comments