본문 바로가기

RxSwift

[RxSwift] Subject 예시 코드와 결과

안녕하세요 태태입니다. 💜 

오늘은 Subject의 예시 코드를 통해서 결과를 보고 이해하는 시간을 가져보려고 합니다.

 

먼저, PublishSubject 부터 살펴보도록 할게요.

1. PublishSubject

초기값이 없으며 새로운 값만 subscribe에 방출한다고 했었는데요, 코드로 한번 알아 보겠습니다.

let subject = PublishSubject<String>()
subject.onNext("PublishSubject")

// 첫 번째 구독 요청
let subscriptionOne = subject
    .subscribe(onNext: { (string) in
        print(string)
    })

subject.on(.next("1"))
subject.onNext("2")

// 두 번째 구독 요청
let subscriptionTwo = subject
    .subscribe({ (event) in
        print("2)", event.element ?? event)
    })

subject.onNext("3")

subscriptionOne.dispose()

subject.onNext("4") 
subject.onCompleted()
subject.onNext("5")

subscriptionTwo.dispose()

 

위 코드를 실행하면 어떻게 출력이 될까요..?! 

PublishSubject 예시코드 실행 결과

 

위와 같이 구독이 시작된 시점 이후의 이벤트만 출력하게 됩니다. (실시간으로 새로운 값만 방출)

 

2. BehaviorSubject

초기 값을 가지며 이후 구독되는것에 대해서 최근 값을 방출한다고 했었는데요. 코드로 한번 보겠습니다.

let subject = BehaviorSubject<String>(value: "init value")

// 첫 번째 구독 요청
let subscriptionOne = subject
    .subscribe(onNext: { (string) in
        print(string)
    })

subject.on(.next("1"))
subject.onNext("2")
// prints : 1, 2

// 두 번째 구독 요청
let subscriptionTwo = subject
    .subscribe({ (event) in
        print("2)", event.element ?? event)
    })

subject.onNext("3")
subscriptionOne.dispose()
subject.onNext("4")

subject.onCompleted()

 

 

위 코드를 실행하면 어떤 결과가 출력될까요..?!

BehaviorSubject 예시코드 실행결과

 

처음 초기값을 가지고, 첫 번째 구독이 시작 될 때 초기값을 방출해주고,
두 번째 구독이 시작될때는 가장 최근 값을 먼저 방출해주는 것을 알 수 있습니다.

 

3. ReplaySubject

구독전에 버퍼 사이즈 만큼 값을 저장했다 구독 시 해당 사이즈만큼 값을 방출해주고 시작된다고 했었습니다. 코드로 확인해볼게요.

let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("ReplaySubject")

// 첫 번째 구독 요청
let subscriptionOne = subject
    .subscribe(onNext: { (string) in
        print(string)
    }).disposed(by: disposeBag)

subject.on(.next("1"))

// 두 번째 구독 요청
let subscriptionTwo = subject
    .subscribe({ (event) in
        print("2)", event.element ?? event)
    }).disposed(by: disposeBag)

subject.onNext("2")
subject.onNext("3")
subject.onNext("4")

// 세 번째 구독 요청
let subscriptionThree = subject
    .subscribe({ (event) in
        print("3)", event.element ?? event)
    }).disposed(by: disposeBag)

subject.onCompleted()

 

위 코드를 실행하면 어떤 결과가 출력될까요..?!

 

버퍼사이즈가 2니까 각각의 subsciption이 2개의 값을 저장했다가, 2개의 값을 방출하고 하나씩 방출할텐데요.
결과를 보도록 하겠습니다 ! 

ReplaySubject 예시코드 실행결과

 

이상으로 오늘은 코드를 통해서 저번 포스팅에서 학습했던 Subject를 이해해보았습니다.

감사합니다 !

'RxSwift' 카테고리의 다른 글

[RxSwift] Observable  (0) 2022.03.03
[RxSwift] RxSwift ?  (0) 2022.02.20