Subject VS Observable
Subject는 Observable과 Observer의 역할을 모두 할 수 있는 Observable이라고 생각하면 된다.
Observable이나 Subject모두 이벤트를 emit하므로 subscribe 할 수 있다.
다만, subscribe에서 차이가 발생하는데, Subject는 multicast 방식이므로 여러 개의 Observer를 subscribe할 수 있다.
단순 Observable은 unicast 방식이므로 observer 하나만을 subscribe할 수 있다.
Observable - unicast
let observableInt = Observable<Int>.create { observer in
observer.onNext(Int.random(in: 1...100))
return Disposables.create()
}
observableInt
.subscribe { value in
print("observableInt \(value)")
}
.disposed(by: disposeBag)
observableInt
.subscribe { value in
print("observableInt \(value)")
}
.disposed(by: disposeBag)
위의 코드를 실행하게 되면 각각 다른 숫자가 출력된다.
왜 ??
observer가 해당 observable에 대해 독자적인 실행을 갖기 때문에
동일한 observable 구독을 통해 생성된 두 개의 observer라고 해도 observable이 각각 실행되면서 observer에게 서로 다른 값이 가는 것이다.
Subject - multicast
multicast가 된다는 것은 하나의 observable 실행이 여러 subscriber에게 공유되는 것을 말한다.
let subjectInt = BehaviorSubject(value: 0)
subjectInt.onNext(Int.random(in: 1...100))
subjectInt
.subscribe { value in
print("subjectInt \(value)")
}
.disposed(by: disposeBag)
subjectInt
.subscribe { value in
print("subjectInt \(value)")
}
.disposed(by: disposeBag)
구독해서 생성될 observer에게 observable의 동일한 실행이 간다.
observable의 실행이 공유되면서 같은 값이 프린트 되는 것을 확인할 수 있다.
정리하자면, observable에서 subscribe를 하면 이벤트로 전달되는 것은 항상 새로운 것이다.
subject에서 subscribe를 하면 이벤트로 전달 되는 것은 subscribe 전에 수행된 onNext 등의 하나의 공통된 것이다.
Observable | Subject |
단순히 함수, state가 존재하지 않는다. | state를 갖고, data를 메모리에 저장한다. |
각각의 옵저버에 대해 코드가 실행된다. | 같은 코드를 실행하지만, 모든 옵저버에 대해 오직 한번만 실행된다. |
data producer | data producer && consumer |
하나의 옵저버에 대해 간단한 observable을 필요로 할 때 사용한다. | 자주 데이터를 저장하고 수정할 때, 여러 개의 옵저버가 데이터를 관찰해야 할 때 사용한다. |
좀 더 자세한 비교는 .. 이후에 정리할 .. cold observable VS hot observable에서 .. 이어서 ..
'Swift > RxSwift' 카테고리의 다른 글
[🌱SeSAC] Observable VS Subject, Drive & Relay (6) | 2022.10.28 |
---|---|
[🌱SeSAC] Observable/Observer, Subject, Relay (0) | 2022.10.26 |
[🌱SeSAC] Disposable, Observable, Subject (0) | 2022.10.26 |
[🔥Rx뿌셔] Disposable (0) | 2022.10.25 |
[🔥Rx뿌셔] Subscribe (0) | 2022.10.25 |