observable์ unicast ๋ฐฉ์
subject๋ multicast ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ๊ฐ์ observer๋ฅผ subscribeํ ์ ์์ต๋๋ค.
๊ตฌ๋
ํ ๋ค์ Observable์ด ๋ณด๋ธ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค.
element ์์ด ๋น ์ํ๋ก ์์ฑ๋๊ณ , subscribeํ ์์ ์ดํ์ ๋ฐ์๋๋ ์ด๋ฒคํธ๋ง ์ ๋ฌ๋ฐ์์.
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject.onNext("Hi")
let o1 = subject.subscribe {print (">>1",$0)}
o1.disposed(by: disposeBag)
subject.onNext("a")
subject.onNext("b")
let o2 = subject.subscribe{print(">>2",$0)}
o2.disposed(by: disposeBag)
subject.onNext("c")
subject.onNext("d")
์ถ๋ ฅ ๊ฒฐ๊ณผ๋?
>>1 next(a)
>>1 next(b)
>>1 next(c)
>>2 next(c)
>>1 next(d)
>>2 next(d)
o1์ ๊ตฌ๋
์์ ์ด์ ์ ๋ฐ์ํ ์ด๋ฒคํธ์ธ Hi์
o2์ ๊ตฌ๋
์์ ์ด์ ์ ๋ฐ์ํ ์ด๋ฒคํธ์ธ Hi,a,b์ ๋ํด์๋ ์ ๋ฌ๋์ง ์๋ ๋ชจ์ต์ ๋ณผ ์ ์์ด์!
๊ตฌ๋
ํ์ ๋ฐ์ํ ์์ ์ด์ ์ ๋ฐ์ํ ์ด๋ฒคํธ ์ค ๊ฐ์ฅ ์ต์ ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค.
์ด๊ธฐ๊ฐ์ ๊ฐ์ง๊ณ ์์ฑ๋๋ค๋ ์ ์ด Behavior Subject ๋ง์ ํน์ง์ด์์!
let disposeBag = DisposeBag()
let subject = BehaviorSubject<String>(value: "start") //observer
subject.onNext("Hi")
let o1 = subject.subscribe {print (">>1",$0)}
o1.disposed(by: disposeBag)
subject.onNext("a")
subject.onNext("b")
let o2 = subject.subscribe{print(">>2",$0)}
o2.disposed(by: disposeBag)
subject.onNext("c")
subject.onNext("d")
์ถ๋ ฅ ๊ฒฐ๊ณผ๋?
>>1 next(Hi)
>>1 next(a)
>>1 next(b)
>>2 next(b)
>>1 next(c)
>>2 next(c)
>>1 next(d)
>>2 next(d)
o1 ๊ธฐ์ค ๊ฐ์ฅ ์ต์ ์ ์ด๋ฒคํธ์ธ Hi์
o2 ๊ธฐ์ค ๊ฐ์ฅ ์ต์ ์ ์ด๋ฒคํธ์ธ b๊ฐ ์ ๋ฌ๋์ด ๋์ค๋ ๋ชจ์ต์ ๋ณผ ์ ์์ด์
๊ตฌ๋
์ ์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๋ฒํผ์ ๋ฃ๊ณ , ๋ฒํผ์ ๋ค์ด์๋ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํด์.
๋ฏธ๋ฆฌ ์ฌ์ด์ฆ๋ฅผ ์ ํด์ค์ผํ๊ณ , ๋ฒํผ ์ฌ์ด์ฆ ๋งํผ์ ์ต์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์์!
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 4) //observer
subject.onNext("Hi 1")
subject.onNext("Hi 2")
subject.onNext("Hi 3")
subject.onNext("Hi 4")
let o1 = subject.subscribe {print (">>1",$0)}
o1.disposed(by: disposeBag)
subject.onNext("a")
subject.onNext("b")
let o2 = subject.subscribe{print(">>2",$0)}
o2.disposed(by: disposeBag)
subject.onNext("c")
subject.onNext("d")
์ถ๋ ฅ ๊ฒฐ๊ณผ๋?
>>1 next(Hi 1)
>>1 next(Hi 2)
>>1 next(Hi 3)
>>2 next(Hi 3)
>>1 next(Hi 4)
>>2 next(Hi 4)
>>1 next(a)
>>2 next(a)
>>1 next(b)
>>2 next(b)
>>1 next(c)
>>2 next(c)
>>1 next(d)
>>2 next(d)
๋ค๋ฅธ subject์ ๋ฌ๋ฆฌ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ์์ ์ด ๋ฌ๋ผ์!
completed ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๊ธฐ ์ ๊น์ง ์ด๋ ํ ์ด๋ฒคํธ๋ ์ ๋ฌํ์ง ์์์.
๋ฐ๋ฉด ์์์ ์ดํด๋ณธ Subject๋ค์ ๋ฐ๋ก ์ ๋ฌ์ด ๋์์ฃ !
completed๋๋ฉด ๊ทธ ์์ ์์ ๊ฐ์ฅ ์ต๊ทผ ์ด๋ฒคํธ ํ๋๋ง next๋ก ์ ๋ฌํด์.
let asubject = AsyncSubject<Int>()
asubject.onNext(1)
asubject.onNext(2)
asubject.onNext(3)
asubject.onCompleted()
aSubject.subscribe({event in
print(event)
})
asubject.onNext(4)
asubject.onNext(5)