//SubjectType에서 ObservableType을 채택
public protocol SubjectType : ObservableType {
associatedtype Observer: ObserverType
/// Returns observer interface for subject.
///
/// - returns: Observer interface for subject.
func asObserver() -> Observer
}
let randomWithIntObservable: Observable<Int> = Observable<Int>.create { observer in
observer.onNext(Int.random(in: 1...100))
return Disposables.create()
}
randomWithIntObservable.subscribe { event in
print("randomWithInt :(1) \(event)")
}
randomWithIntObservable.subscribe { event in
print("randomWithInt :(2) \(event)")
}
Int Type의 Observable을 생성하여 observer가 1 부터 100까지의 숫자의 이벤트를 처리하도록 코드를 구현 하였습니다. 이렇게 구독을 통해 이벤트를 방출 시켜 동일한 값이 나오는지 확인을 해보았지만 결과는!!
서로 다른 값의 Event를 방출(Emit)하는 것을 확인 할 수 있었습니다. 이유는 Observable는 Unicast 방식 이기때문 입니다!! Unicast 방식은 (1:1)연결 방식으로 한 가지의 observer만 subscribe(구독) 관찰 할 수 있습니다. 그렇기에 첫번째 observer가 끝난후 Disposeable이 Return 되고 두 번째 subscribe(구독)이 호출 되는 형식으로 됩니다.
let randomWithSubject: PublishSubject<Int> = PublishSubject<Int>()
randomWithSubject.subscribe { event in
print("randomWithIntSubject :(1) \(event)")
}
randomWithSubject.subscribe { event in
print("radomWithIntSubject :(2) \(event)")
}
randomWithSubject.onNext(Int.random(in: 1...100))
Observable와 다르게 Subject가 onNext(이벤트 방출) 뿐만 아니라 Subscribe(구독) 역활을 하시는 것을 볼 수 있습니다. 또한 Observable와 다르기 MultiCast 방식 이기에 결과 값 역시 차이점 이 있습니다.
Subscribe(구독)을 통해 방출한 이벤트 결과 값이 동일한 것을 확인 하실수 있습니다. 이유는 앞서 강조 하였던 MultiCast 방식이기 때문 입니다. Subject는 여러 observer를 Subscribe(구독), 관찰 할수 있으며, 쉽게 말해 공유 할수 있습니다. 그렇기에 첫번 째 구독한 이벤트를 두번째 구독한 이벤트에게 넘겨 준 것입니다!!