티스토리 뷰

IOS/RxSwift

[RxSwift] Subject 알아보기

내일도이렇게 2022. 4. 19. 23:26

PublishSubject 

빈 상태로 시작하여 새로운 값만을 subscriber 에 방출한다. 

구독 이후에 발생하는 모든 이벤트를 전달받는다.

 

let disposeBag = DisposeBag()

print("-------publishSubject-------")
let publishSubject = PublishSubject<String>()

publishSubject.onNext("여러분 안녕하세요?")

let 구독자1 = publishSubject
    .subscribe(onNext: {
        print($0)
    })
//    .disposed(by: disposeBag)

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

let 구독자2 = publishSubject
    .subscribe {
        print("두번째 구독:", $0.element ?? $0)
    }

publishSubject.onNext("3")

구독자1.dispose()

publishSubject.onNext("4")
publishSubject.onCompleted()

publishSubject.onNext("5")

구독자2.dispose()


publishSubject
    .subscribe {
        print("세번째 구독:", $0.element ?? $0)
    }
    .disposed(by: disposeBag)

publishSubject.onNext("찍힐까요?")

-------publishSubject-------
1
2
3
두번째 구독: 3
두번째 구독: 4
두번째 구독: completed
세번째 구독: completed

 

BehaviorSubject 

하나의 초기값을 가진 상태로 시작하여, 새로운 subscriber 에게 초기값 또는 최신값을 방출한다. 

구독 전에 발생한 최근 요소와 이후에 발생하는 모든것들을 전달 받는다.

 

print("-------behaviorSubject-------")
enum SubjectError: Error {
    case error1
}

let behaviorSubject = BehaviorSubject<String>(value: "초기값")

behaviorSubject.onNext("첫번째값")

behaviorSubject.subscribe {
    print("첫번째 구독:", $0.element ?? $0)
}
.disposed(by: disposeBag)

behaviorSubject.onError(SubjectError.error1)

behaviorSubject.subscribe {
    print("두번째 구독:", $0.element ?? $0)
}
.disposed(by: disposeBag)

let value = try? behaviorSubject.value()
print(value)

-------behaviorSubject-------
첫번째 구독: 첫번째값
첫번째 구독: error(error1)
두번째 구독: error(error1)
nil

 

ReplaySubject 

버퍼를 두고 초기화하며, 버퍼 사이즈 만큼의 값들을 유지하면서 새로운 subscriber 에게 방출한다. 

모든 구독 이전에 발생한 내용을 받고 싶다면 RelaySubject 를 사용한다.

 

print("-------ReplaySubject-------")
let replaySubject = ReplaySubject<String>.create(bufferSize: 2)

replaySubject.onNext("a")
replaySubject.onNext("b")
replaySubject.onNext("c")

replaySubject.subscribe {
    print("첫번째 구독:", $0.element ?? $0)
}
.disposed(by: disposeBag)

replaySubject.subscribe {
    print("두번째 구독:", $0.element ?? $0)
}
.disposed(by: disposeBag)

replaySubject.onNext("d")
replaySubject.onError(SubjectError.error1)
replaySubject.dispose()

replaySubject.subscribe {
    print("세번째 구독:", $0.element ?? $0)
}
.disposed(by: disposeBag)

-------ReplaySubject-------
첫번째 구독: b
첫번째 구독: c
두번째 구독: b
두번째 구독: c
첫번째 구독: d
두번째 구독: d
첫번째 구독: error(error1)
두번째 구독: error(error1)
세번째 구독: error(Object `RxSwift.(unknown context at $12d722e70).ReplayMany<Swift.String>` was already disposed.)

Reference 

https://fastcampus.co.kr/dev_online_iosapp

https://reactivex.io/documentation/subject.html

https://pilgwon.github.io/blog/2018/10/08/Learn-Master-the-Basics-of-RxSwift-in-10-Minutes.html

'IOS > RxSwift' 카테고리의 다른 글

RxSwift 개념  (0) 2022.04.13
[RxSwift] Single,Maybe,Completable 알아보기  (0) 2022.04.12
[RxSwift] Observable 알아보기  (0) 2022.04.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함