
Subject는 ReactiveX의 일부 구현에서 사용할 수 있는 일종의 다리 또는 프록시로, 관찰자(Observer) 및 옵저버블(Observable)의 역할을 동시에 수행하는 것입니다.
.next(value)를 받고, 수신할 때마다 subscriber에게 방출합니다.PublishSubject는 구독 이후에 소스 Observable(들)이 배출한 항목들만 옵저버에게 배출한다.
let subject = PublishSubject<String>() // 초기값 없이 생성
subject.onNext("a")
subject.onNext("b")
subject.subscribe { element in
print("subscribe 1:", element)
} onError: { error in
print("subscribe error 1:", error)
} onCompleted: {
print("subscribe 1 onCompleted")
}.disposed(by: disposeBag)
subject.onNext("c")
subject.subscribe { element in
print("subscribe 2:", element)
} onError: { error in
print("subscribe error 2:", error)
} onCompleted: {
print("subscribe 2 onCompleted")
}.disposed(by: disposeBag)
subject.onNext("d")
subject.onNext("e")
subject.onCompleted()
subscribe 1: c
subscribe 1: d
subscribe 2: d
subscribe 1: e
subscribe 2: e
subscribe 1 onCompleted
subscribe 2 onCompleted
let subject = BehaviorSubject(value: "0") // 생성 시 초기값
subject.onNext("a")
subject.onNext("b")
subject.subscribe { element in
print("subscribe 1:", element)
} onError: { error in
print("subscribe error 1:", error)
} onCompleted: {
print("subscribe 1 onCompleted")
}.disposed(by: disposeBag)
subject.onNext("c")
subject.subscribe { element in
print("subscribe 2:", element)
} onError: { error in
print("subscribe error 2:", error)
} onCompleted: {
print("subscribe 2 onCompleted")
}.disposed(by: disposeBag)
subject.onNext("d")
subject.onNext("e")
subject.onCompleted()
subscribe 1: b
subscribe 1: c
subscribe 2: c
subscribe 1: d
subscribe 2: d
subscribe 1: e
subscribe 2: e
subscribe 1 onCompleted
subscribe 2 onCompleted
/// static func create(bufferSize: Int) -> ReplaySubject<Element>
/// 메서드로 생성
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("a")
subject.onNext("b")
subject.subscribe { element in
print("subscribe 1:", element)
} onError: { error in
print("subscribe error 1:", error)
} onCompleted: {
print("subscribe 1 onCompleted")
}.disposed(by: disposeBag)
subject.onNext("c")
subject.subscribe { element in
print("subscribe 2:", element)
} onError: { error in
print("subscribe error 2:", error)
} onCompleted: {
print("subscribe 2 onCompleted")
}.disposed(by: disposeBag)
subject.onNext("d")
subject.onNext("e")
subject.onCompleted()
subscribe 1: a
subscribe 1: b
subscribe 1: c
subscribe 2: b
subscribe 2: c
subscribe 1: d
subscribe 2: d
subscribe 1: e
subscribe 2: e
subscribe 1 onCompleted
subscribe 2 onCompleted
subscriber에게 전달합니다.enum AsyncSubjectError: Error {
case asyncSubjectError
}
let subject1 = AsyncSubject<String>()
subject1.subscribe { element in
print("subscribe 1:", element)
} onError: { error in
print("subscribe error 1:", error)
} onCompleted: {
print("subscribe 1 onCompleted")
}.disposed(by: disposeBag)
subject1.onNext("a")
subject1.onNext("b") // subscribe event가 전달되지 않습니다.
subject1.onCompleted() // subscribe event 마지막 이벤트 .next("b")가 전달됩니다.
let subject2 = AsyncSubject<String>()
subject2.subscribe { element in
print("subscribe 2:", element)
} onError: { error in
print("subscribe error 2:", error)
} onCompleted: {
print("subscribe 2 onCompleted")
}.disposed(by: disposeBag)
subject2.onNext("a")
subject2.onNext("b")
subject2.onError(AsyncSubjectError.asyncSubjectError) //subscribe event 마지막 이벤트 .next("b")가 전달됩니다.
subscribe 1: b
subscribe 1 onCompleted
subscribe error 2: asyncSubjectError