observable 인 동시에 observer
subject 로 전달되는 이벤트를 observer 에게 전달
이벤트가 전달 되는 즉시 구독자에게 전달하는 subject
-> subject 가 최초로 생성되는 시점과 구독이 시작되는 시점 사이에 생성되는 이벤트는 사라짐
-> 이벤트가 사라지지 않게 하려면 다른 observable 사용 필요
let subject = PublishSubject<String>() //문자열이 포함된 nextevent 를 받아서 다른 observer 에게
// subject 생성시점에는 내부에 아무 이벤트가 저장되어 있지 않음
/*1. subject 이벤트 전달 이후 구독자 생성*/
subject.onNext("hello")
let o1 = subject.subscribe( {print(">> 1", $0)})
o1.disposed(by: disposeBag)
// 출력 X
// 구독이후에 전달되는 새로운 이벤트만 구독자로 전달되기 때문에
// 구독자가 구독시작전 전달되었던 next 이벤트는 오저버로 전달 X
/*1-2. 구독자 생성 이후 전달된 이벤트*/
subject.onNext("RxSwift")
// 출력됨
/*2. 구독자 추가*/
let o2 = subject.subscribe{print(">> 2", $0)}
subject.onNext("Subject")
// o1 -> subject, RxSwift 전달
// o2 -> subject 만 전달
/*3. 완료*/
subject.onCompleted() 또는
subject.onError(MyError.error)
// o1, o2 에게 이벤트 전달
/*3-1.*/ 새로운 구독자 추가 (완료된 이후에)
let o3 = subject.subscribe{print(">> 3", $0)}
o3.disposed(by: disposeBag)
// o3 에게는 next 없이 완료이벤트만 전달
가장 최근 이벤트를 저장하고 새로운 구독자에게 전달
// publish
let p = PublishSubject<Int>() // 비어있는 생성자
// behavior
let b = BehaviorSubject<Int>(value: 0) // 값 전달
지정된 수만큼 이벤트를 저장
let rs = ReplaySubject<Int>.create(bufferSize: 3) // 3개의 next 이벤트전달가능
(1...10).forEach{rs.onNext($0)}
rs.subscribe{print("observer 1 >> ", $0)}.disposed(by: disposeBag)
rs.onNext(11)
completed 이벤트가 전달되는 시점에 가장 최근 next 이벤트 1개를 구독자로 전달
let sub = AsyncSubject<Int>()
sub
.subscribe{print($0)}
.disposed(by: bag)
sub.onNext(1)
sub.onNext(2)
sub.onCompleted()
/**-출력-/
next(2)
completed
subject 를 래핑, 소스로 부터 next 이벤트를 받아서 다른 구독자로 전달
- publish relay, behavior relay
accept
import RxCocoa
let bag = DisposeBag()
let pr = PublishRelay<Int>()
let br = BehaviorRelay<Int>(value: 1)
pr.subscribe{ print("1: \($0)")}.disposed(by: bag)
pr.accept(1)