Subject
- Subject는 옵저버블처럼 값을 받을 수 있고 외부에서 값을 통제할 수 있는 특별한 형태의 스트림입니다.
- 옵저버블은 이미 정해진 데이터를 내보내는 스트림이지만, Subject는 외부에서 데이터를 주입하고 구독도 가능한 특징을 가지고 있습니다.
- 값 주입 및 통제: Subject는 외부에서
.onNext(값)
과 같은 메서드를 사용하여 값을 주입할 수 있습니다. 이로써 Subject에게 새로운 데이터를 전달할 수 있습니다.
- 옵저버블처럼 동작: Subject는 옵저버블처럼 동작하여 값을 구독할 수 있습니다. 따라서 Subject에 데이터가 흘러들어올 때마다 등록된 옵저버(Subscriber)들에게 해당 데이터가 전달됩니다.
- 데이터의 내보내기를 통제: Subject를 생성할 때 어떤 데이터를 내보낼지 미리 정할 수 있습니다. 이는 Subject가 생성되면서 이미 스트림에 데이터가 정해져 있다는 점을 의미합니다.
- 옵저버블은 데이터가 이미 정해진 스트림으로, create할 때 어떤 데이터를 내보낼지 미리 결정됩니다. 그러나 외부에서 옵저버블에 데이터를 주입하려면 추가적인 메커니즘이 필요합니다. 이 때 등장하는 것이 Subject입니다.
- Subject는 외부에서 값을 주입할 수 있는 옵저버블의 확장이며, 생성 시점에는 어떤 데이터를 내보낼지 미리 정할 수 있습니다. 이로써 Subject는 옵저버블을 동적으로 제어하면서 데이터를 주고받을 수 있는 중간자 역할을 수행합니다.
PublishSubject
- 서브젝트의 어떤것이 Subscribe하면 데이터를 그시점부터 내려보내줌
- 다른애가 구독해도 그 구독 시점 이후에 데이터를 보내줌
- 자체가 서브젝트의 누군가가 구독을 할 수 있음 내부에서 데이터가 생성되면 데이터를 내려준다.
![](https://velog.velcdn.com/images/ljh3904_a/post/a8057a6d-9bfa-4d24-a225-9a3c4b0e300e/image.png)
BehaviorSubject
- PublishSubject과 다르게 기본값을 가지고 시작한다 .
- 누군가가 구독하면 기본값을 내려보내줌
- 새로운놈이 중간에 구독하면 최근의 발생한 값을 내려보내줌
![](https://velog.velcdn.com/images/ljh3904_a/post/99696c99-a32e-4865-a389-0d30e9f6f7ce/image.png)
let menus: [Menu] = [
Menu(title: "이제현", price: 10000, count: 1),
Menu(title: "이제서", price: 2000, count: 3),
Menu(title: "이제사", price: 30000, count: 2),
Menu(title: "이제수", price: 40000, count: 4),
]
lazy var menuObservable =
BehaviorSubject<[Menu]>(value: menus)
ReplaySubject
- 처음 기능은 PublishedSubject와 기능이 비슷하나 누군가가 구독을 하면 구독시점 전의 데이터도 내려보내줍니다.
![](https://velog.velcdn.com/images/ljh3904_a/post/74964ef1-7963-4a81-ab84-854a00581510/image.png)
AsyncSubject
- 누군가가 구독을해도 마지막 OnComplete가 되기전까지는 보내지 않고 OnComplete가 되면 그때 마지막 데이터를 보내줍니다.
![](https://velog.velcdn.com/images/ljh3904_a/post/67f57eb6-161d-4869-ac9a-889b7e725f6f/image.png)