[RxSwift] ์์์ ํ๋ฆ๋๋ก Observable ํํค์ณ๋ณด๊ธฐ
์ฌํ๋์ RxSwift๋ฅผ ์ฝ๋๋ ๋ฒจ์์ ๋ถ์ํด๋ณด์ ์ ์ด ์๋์?
์ต๊ทผ ๋ฉด์ ์์ Rx์ ๋ํ ์ง๋ฌธ์ ๋ฐ์ ์ ์ด ์์ต๋๋ค. ๊ทธ๋ ๋ฌด์จ ๋ง์ ํ๋์ง ์ ๊ธฐ์ต์ด ์๋์ง๋ง.. Rx์ ๋ํด์ ์ดํด๋ฅผ ์ ๋๋ก ํ์ง ๋ชปํ๊ณ ์์์์ ๊นจ๋ซ๊ณ ์ฝ๋๋ ๋ฒจ๋ก ํ ๋ฒ ๋ฏ์ด๋ณด๋ ค๊ณ ํฉ๋๋ค!
Observable
๋จผ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ Observable์ ํ์ผ๋ถํฐ ์ฐพ์๊ฐ๋ณด์์ต๋๋ค.
์ผ๋จ ํด๋์ค์ด๊ณ ๋ด๋ถ์ subscribe์ asObservable ๋ฉ์๋๊ฐ ์๋ค์. ์ผ๋จ asObservable์ ์๊ธฐ ์์ ์ ๋ฐํํ๊ณ ์๊ณ , subscribe๋ rxAbstractMethod()๋ผ๋ ํจ์์ ํธ์ถ ์ธ์๋ ๋ค๋ฅธ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค.
๊ทธ๋์ rxAbstractMethod()๋ฅผ ์๊ธฐ์ํด ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์๋ Rx.swift์ ์ฐพ์๊ฐ๋ณด์๋๋ฐ์,
์ด๋ ๊ฒ ์ ์๊ฐ ๋์ด์๋ค์. ์ด ์ฝ๋๊ฐ ๋ค์ด์๋ ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋์ด๊ณ , ์ด ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋ฉด ๋ฐํ์ ์๋ฌ๋ฅผ ๋
๋๋ค. ๋ฐ๋ผ์ subscribe๋ Observable ํด๋์ค๋ฅผ ์์ํ๋ ๊ฐ ์ฌ๋ฌ Observable์ ํด๋์ค๋ค์ด ์ง์ ๊ตฌํํ๊ณ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ถํ ์ ์์์ต๋๋ค.
๋ ๋ค์ด๊ฐ๊ธฐ ์ ์ Observable์๋ ObservableType์ด ๋ถ์ด์์ผ๋ ์ด ๋ถ๋ถ๋ถํฐ ๋จผ์ ์์๋ณผ๊ฒ์.
ObservableType
ObservableType์ ํ๋กํ ์ฝ์ด๋ค์. ๋ด๋ถ์๋ subscribe์ ๋ํ ์ธํฐํ์ด์ค๊ฐ ์ ์๋์ด์์ต๋๋ค. ์คํค์คํค subscribe๋ Observable์ด ๋ค๊ณ ์๋๊ฒ ์๋๋ผ ObservableType์ ์ฑํํ๊ณ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ด์๋ค์!
subscribe์ ๋ํด ๊ธธ๊ฒ ์ ํ์๋ ์ฃผ์์ ํด์ํด๋ณผ๊ฒ์.
/** Subscribes `observer` to receive events for this sequence.
์ต์ ๋ฒ๊ฐ ์ด ์ํ์ค๋ก๋ถํฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋๋ก ๊ตฌ๋ ํฉ๋๋ค.
### Grammar **Next\* (Error | Completed)?**
sequences can produce zero or more elements so zero or more `Next` events can be sent to `observer`
์ํ์ค๋ค์ 0๊ฐ ์ด์์ ์์ดํ ์ Next ์ด๋ฒคํธ๋ฅผ ํตํด ์ต์ ๋ฒ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
once an `Error` or `Completed` event is sent, the sequence terminates and can't produce any other elements
Error๋ Completed ์ด๋ฒคํธ๊ฐ ์ ์ก๋๋ฉด, ์ด ์ํ์ค๋ ์ข ๋ฃ๋๊ณ ๋ค๋ฅธ ์์ดํ ์ ์์ฐํ ์ ์์ต๋๋ค.
It is possible that events are sent from different threads, but no two events can be sent concurrently to `observer`.
์ด๋ฒคํธ๋ค์ด ์๋ก ๋ค๋ฅธ ์ค๋ ๋์์ ์ ์ก๋๋ ๊ฒ์ ๊ฐ๋ฅํ์ง๋ง, ๋ ์ด๋ฒคํธ๊ฐ ๋์์ ์ต์ ๋ฒ์ ์ ์ก๋ ์๋ ์์ต๋๋ค.
### Resource Management
When sequence sends `Complete` or `Error` event all internal resources that compute sequence elements will be freed.
์ํ์ค๊ฐ Complete์ด๋ Error ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋ฉด, ์ํ์ค์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ค์ ํด์ ๋ฉ๋๋ค.
To cancel production of sequence elements and free resources immediately, call `dispose` on returned subscription.
์ํ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฐํ๋ ๊ฒ์ ์ข ๋ฃํ๊ณ ๋ฆฌ์์ค๋ฅผ ๊ณง๋ฐ๋ก ํด์ ํ๊ฒ ํ๋ ค๋ฉด ๋ฐํ๋ ๊ตฌ๋ ๊ฐ์ฒด์ dispose๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
- returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. */
Observer๋ฅผ ์ํ ๊ตฌ๋ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ์ํ์ค๋ฅผ ์ทจ์ํ๊ณ ๋ฆฌ์์ค๋ฅผ ํด์ ํ ์ ์๋๋ก ํฉ๋๋ค.
Subscribe์ ๋ํ ์ค๋ช
์ด์๋๋ฐ์, ๊ฒฐ๊ตญ subscribe๋ ์ธ์๋ก ๋ฐ์ ์ต์ ๋ฒ๋ฅผ ์ํ์ค์ ์ฐ๊ฒฐํ๊ณ ์ํ์ค๋ฅผ ์ทจ์ํ ์ ์๋ subscription ๊ฐ์ฒด์ธ Disposable์ ๋ฐํํ๋ ๋ฉ์๋์
๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ObservableType์ ๋ํ Extension๋ ์์ผ๋ ํ๋ฒ ๋ด
์๋ค.
asObservable์๊ตฌํํ๊ณ ์๋๋ฐ์, Observableํ์
์ด ๊ฐ์ง create ๋ฉ์๋๋ฅผ ๋ถ๋ฌ์ ์ ๋ฌ๋ ์ธ์๋ฅผ subscribe ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค.
create ๋ฉ์๋์ ์ ์๋ RxSwift/Observables/Create.swift ์์ ์ฐพ์ ์ ์์์ด์.
create๋ ํ์
๋ฉ์๋ ์์ต๋๋ค. ๊ทธ๋์ ์์์๋ Observable.create๋ก ํธ์ถ ํ ์ ์์์ฃ . ์ธ์๋ก๋ escaping closure๋ฅผ ํ๋ ๋ฐ๋๋ฐ์, subscribe์ ์ ์์ ๋์ผํฉ๋๋ค. ์ฃผ์์ ๋ณด๋ ๊ฐ ์ต์ ๋ฒ๋ธ์ subscribe๋ฉ์๋ ๊ตฌํ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ผ๊ณ ํ๋ค์. ๊ทธ๋ฆฌ๊ณ ๋ฐํ๊ฐ์ผ๋ก๋ ์ํ์ค๋ฅผ ๋ฐํํ๋๋ฐ, ์ ๋ฌ๋ subscribe ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ํ์ค๊ฐ ๋ฐํ๋ฉ๋๋ค.
๋ฌด์จ ์๋ฆฐ์ง ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ค์ ๋ก ๋ฐํ๋๋ ํ์
์ธ AnonymousObservable์ ์ฐพ์๋ณด๊ธฐ๋ก ํ์ด์..
AnonymousObservable
AnonymousObservable๋ ๊ฐ์ Create.swiftํ์ผ ์์ ์ ์๋์ด ์์์ต๋๋ค. ๋จผ์ typealias๊ฐ ๋์ ๋๋๋ฐ์, subscribe์ ํ๋ผ๋ฏธํฐ์ ํ์์ด ๊ฐ์ต๋๋ค! ๊ตฌ๋
์ด ์์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ ํด๋ก์ ๋ก ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์์. ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ ์์ ์์ ์ด ํด๋ก์ ๋ฅผ ์ธ์๋ก ๋ฐ๊ธฐ๋ ํ๋ค์.
์๊น create ๋ฉ์๋์์ AnonymousObservable ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ฉด์ subscribe ๋ฉ์๋์ ๊ตฌํ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋๋ฐ์, ์ด ๊ตฌํ์ฒด๊ฐ subsribeHandler๋ก ์ฌ์ฉ๋๋ ๊ตฌ์กฐ์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ผ ์ ์ผ ์ค์ํด๋ณด์ด๋ run ๋ฉ์๋๋ฅผ ๋ณผ๊น์?
run method๋ ๋ด๋ถ๋ ๊ฝค ๋จ์ํ๋ฐ์, ์ฒ์๋ณด๋ ์ ๋ค์ด ๋ง๋ค์..
๋จผ์ ์ธ์๋ก๋ ObservableType์ ์ฑํํ๋ Observer ํ์
๋ค, Cacelable ํ์
์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๊ณ , sink์ subscription์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ํํ๋ก ๊ฐ๊ฐ Disposable์ ์ธ์คํด์ค๊ฐ ๋ด๊ฒจ ๋ฐํ๋ฉ๋๋ค.
sink์ ์ ์ฅ๋๋ ๊ฐ์ AnonymousObservableSink์ ์ธ์คํด์ค์
๋๋ค. ๊ทธ๋์ ๋ ์ฐพ์๊ฐ๋ดค์ด์.
์ค ์ฌ๊ธฐ์ ๊ทธ๋๋ ์ต์ํ ํจ์๊ฐ ํ๋ ๋ณด์
๋๋ค. on ๋ฉ์๋๊ฐ ์๋ค์..! on์ด ํธ์ถ๋๋ฉด ์ธ์๋ก ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๊ณ ์ด ์ด๋ฒคํธ๊ฐ next๋ผ๋ฉด forwardOn๋ฉ์๋์ ์ด๋ฒคํธ๋ฅผ ๋ด์ ๋ณด๋ด๊ณ , error๋ completed๋ผ๋ฉด forwardOn์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ธ ํ์ ์ํ์ค๋ฅผ dispose ์ํค๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ run ๋ฉ์๋์์๋ Parent ํ์
(AnonymousObservable<Element>)์ ๋ฐ์ ์๊ธฐ์์ ์ AnyObserver๋ก ์บ์คํ
ํ ๋ค์ Parent๊ฐ ๊ฐ์ง subscribe ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌํ๋ฉฐ ์คํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒฐ๊ณผ์ธ Disposable์ ๋ฐํํด์.
forwardOn์ ์ด๋์ ์์๊น์? AnonymousObservableSink์ ์ ์ธ๋ถ๋ฅผ ๋ณด๋ Sink<Observer>์ OberverType ๋ ๊ฐ์ง๋ฅผ ์ฑํํ๊ณ ์๋๋ฐ, ์ํผํด๋์ค์ธ Sink ํด๋์ค๋ฅผ ์ฐพ์๊ฐ ๋ณด์์ต๋๋ค.
forwardOn๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ์์ ์ด ๊ฐ์ง observer์ on ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฉ์๋์์ต๋๋ค.
์์์ ํ๋ฆ ์ ๋ฆฌํ๊ธฐ - 1
์ ๊ทธ๋ผ ์ง๊ธ ์ฝ๊ฐ ๋งฅ๋ฝ์ ์์ ๊ฒ ๊ฐ์ผ๋๊น.. (์ ๋ ์คํฌ๋กค์ ๊ณ์ ์ฌ๋ ธ๋ค ๋ด๋ ธ๋ค ํ๊ณ ์์ด์..) ์ง๊ธ๊น์ง์ ์์์ ํ๋ฆ์ ์ ๋ฆฌํด๋ณผ๊ฒ์.
1. ๋จผ์ ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ Observable์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง ์๊ณ ์ถ์์ด์. ๊ทธ๋์ ์ฝ๋๋ฅผ ๋ค์ฌ๋ค ๋ดค๊ณ ๋ด๋ถ์๋ ์ถ์ ๋ฉ์๋์ธ subscribe์ asObservable์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๊ฒฌํ์ฃ . ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก subscribe๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ๊ณตํ๋ ํ๋กํ ์ฝ์ธ ObservableType์ด ์กด์ฌํ์ด์. ๋ชจ๋ Observable๋ค์ ์ด ์ธํฐํ์ด์ค์ ๋ํ ๊ตฌํ์ฒด๋ฅผ ๊ฐ๊ฐ ๊ฐ์ง๊ณ ์๋๊ฑฐ์ฃ .
2. asObservable์์๋ Observable.create๋ผ๋ ๋ฉ์๋๊ฐ ์ฌ์ฉ๋๊ณ ์์๋๋ฐ์, ์์ฃผ ์ฌ์ฉ๋๋ create ๋ฉ์๋๋ฅผ ์์๋ณด๊ธฐ ์ํด์ create์ ๊ตฌํ ๋ฉ์๋๋ฅผ ์ฐพ์๋ณด์์ต๋๋ค.
3. ๊ทผ๋ฐ ๋ง์ create๋ฅผ ์ด์ด๋ณด๋๊น ๋ณ๊ฑฐ ์์์ด์.. ์ ๋ฌ๋ฐ์ subscribe ๋ฉ์๋์ ๊ตฌํ์ฒด๋ฅผ ์ธ์๋ก ๋๊ฒจ AnonymousObservable ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ณ ์์์ฃ .
4. ๊ทธ๋์ AnonymousObservable์ ์ด์ด๋ณด์์ต๋๋ค. ๋จผ์ , ์ธ์๋ก ์ ๋ฌ๋ฐ์ subscribe ๋ฉ์๋๋ฅผ subscribeHandler๋ผ๋ ์ด๋ฆ์ typealias๋ก ๊ฐ์ง๊ณ ์์์ต๋๋ค.
5. ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ์ ๋ฑ ํ๋ ์๋ ๋ฉ์๋๋ run ๋ฉ์๋์์ด์. ์ด ๋ฉ์๋๋ sink ์ subscription์ด๋ผ๋ ์ด๋ฆ์ ๋ Disposable์ ํํ๋ก ๋ฌถ์ด์ ๋ฐํํด์ฃผ๋ ํจ์์์ต๋๋ค.
6. ์ด์ ๋ sink๋ subscription์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋์ง ๊ถ๊ธํด์ก์ฃ . sink๋ฅผ ๋ดค๋๋ AnonymousObservableSink์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ subscription์ ์ด AnonymousObservableSink์ ๋ฉ์๋ ์ค run์ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์์์ด์. run์ ํธ์ถํ ๋๋ ์ธ์๋ก ๋ฐ์ ์ต์ ๋ฒ๊ฐ ์๋๋ผ ํ์ฌ ์ธ์คํด์ค ์๊ธฐ ์์ ์ ์ ๋ฌํ๊ณ ์์์ฃ .
7. AnonymousObservableSink ์์๋ ์ด๋๊ฐ ์ต์ํ on ๋ฉ์๋๊ฐ ์์์ด์. ์ด ๋ฉ์๋๋ ์ ๋ฌ๋ ์ด๋ฒคํธ์ ๋ฐ๋ผ์ next๊ฐ ์ ๋ฌ๋๋ฉด forwardOn์ด๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์์๊ณ , error๋ complete ์ด๋ฒคํธ์๋ forwardOn ์ดํ์ dispose๊น์ง ํธ์ถํด์ ์ํ์ค๋ฅผ ๋ซ์์ฃผ๊ณ ์์์ต๋๋ค.
8. ๊ทธ๋ผ forwadOn๋ ํ์ธํด๋ด์ผ๊ฒ ์ฃ ? fowardOn์ ๋ถ๋ชจํด๋์ค์ธ Sink<Observer>์ ์๋ ๋ฉ์๋์๊ณ , ์์ ์ ๋ฉค๋ฒ ๋ณ์์ธ observer์ on์ ํธ์ถํด์ฃผ๊ณ ์์์ต๋๋ค.
์ค ๋ฌด์จ ์๋ฆฐ์ง ๋ชจ๋ฅด๊ฒ ์ฃ ? ์ ๋ ๊ทธ๋์..
run ๋ค์๋ณด๊ธฐ
์ด๋์์ ํ๋ฆ์ ๋์ณค๋์ง ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋ค๊ฐ
AnonymousObservableSink์์ run ๋ฉ์๋ ๋ถ๋ถ์ ์ดํดํ์ง ๋ชปํ๋ค๋ ์๊ฐ์ด ๋ค์์ด์. parent ๋ฅผ ์ ๋ฌํ๋ ๊ฒ ๊น์ง๋ ๊ทธ๋ ๋ค ์น๋๋ฐ.. subscribeHandler๋ ๋ถ๋ช
ํด๋ก์ ๋ฅผ ์ ์ฅํ๋๋ฐ ์ ๋ฐ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ค์ง..? ๋ผ๋ ์๊ฐ์ด์.
๊ทธ๋์ AnyObserver๋ฅผ ๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
๋ด๋ถ์๋ ๋ ์ข
๋ฅ์ ์์ฑ์๊ฐ ์กด์ฌํ๊ณ ์๋๋ฐ์, ํ๋๋ EventHandler ํด๋ก์ ๋ฅผ ๋ฐ๋ ์์ฑ์์ด๊ณ , ํ๋๋ ObserverType ์ ๋ฐ๋ ํด๋ก์ ๊ฐ ์์ด์.
์๊น run ๋ฉ์๋์์๋ self๋ฅผ ์ ๋ฌํ๊ณ ์์์ผ๋๊น ObserverType์ ์ฑํํ๊ณ ์๋ AnonymousObservableSink ์ธ์คํด์ค๊ฐ ์ ๋ฌ์ด ๋์๊ฒ ์ฃ . ๊ทธ๋ผ ๋๋ฒ์งธ ์์ฑ์์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ด์ผ๊ฒ ๋ค์.
์ต์ ๋ฒ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ ํด๋ก์ ๋ฅผ ์์ ์ EventHandler๋ก ํ ๋นํ๊ณ ์์์ต๋๋ค.
๋ค์ ์ด ์ฝ๋๋ก ๋์๊ฐ๋ฉด
run ๋ฉ์๋๋ ์ฌ๊ธฐ์ subscription์ ๋ง๋ค๊ธฐ ์ํด ํธ์ถ์ด ๋๋๋ฐ์, run ํธ์ถ๊ณผ ํจ๊ป ์ ๋ฌ๋ Observer๋ก sink๋ผ๋ ๋ณ์์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ์๊ธฐ์์ ์ sink.run์ ์ธ์๋ก ์ ๋ฌํด subscriptionHandler๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์์์ต๋๋ค.
๊ทธ๋ผ ๊ฒฐ๊ตญ์๋ ์์ฑ๋ AnonymousObservable์์ run์ ํธ์ถํ๋ฉด ํธ์ถ๊ณผ ํจ๊ป ์ ๋ฌ๋ ์ต์ ๋ฒ์ ๋ํ AnonymousObservableSink ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ธ์คํด์ค์ ๋ํ run์ ํธ์ถํ๋ฉด์ ์๊ธฐ์์ ์ ์ ๋ฌํ๋ฉด ์์ ์ด ๊ฐ์ง๊ณ ์๋ subscribe ๋ฉ์๋์ ๊ตฌํ์ฒด๋ฅผ ํธ์ถํ๋ฉด์ ์ธ์์ ์ต์ ๋ฒ๋ก AnonymousObservableSink์ธ์คํด์ค๋ฅผ ์ ๋ฌํด์ฃผ๊ฒ ๋ฉ๋๋ค.
์ค ๋ญ๊ฐ ์ข ๋๋์ด ์ค์ง ์๋์??
์ฝ๋๋ ๊ฐ์ด ๋ณด๊ธฐ
Observable<String>.create({ (observer) -> Disposable in
observer.onNext("1")
return Disposables.create()
})
create๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์์ฃ ?
๊ทธ๋ผ ์๊น ๋ดค์๋ ์ด ์ฝ๋๊ฐ ์คํ๋ ํ
๋ฐ์, Eelemt๋ ๋ฐํ์์ String ์ผ๋ก ์ ํด์งํ
๊ณ , ๋ด๋ถ ๊ตฌํ๋๋ก AnonymousObservable์ด ์คํ๋๊ฒ ๋ค์.
๊ทธ๋ฆฌ๊ณ ์ธ์๋ก ์ ๋ฌ๋๋ ํด๋ก์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์๋
{ (observer) -> Disposable in
observer.onNext("1")
return Disposables.create()
}
์ด๊ฒ ๋๊ฒ ์ต๋๋ค! ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ฅด๊ณ ์์์ง๋ง observer๋ผ๊ณ ๋ง๋ค์๋ ํ๋ผ๋ฏธํฐ๊ฐ AnyObserver๋ฅผ ์๋ฏธํ๊ณ ์์๋ค์. ๊ทธ๋์ ๋ด๋ถ์์ onNext, onError ๊ฐ์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ ์ ์์๋๊ฑฐ์์!
์ ์ด์ ์ด ํด๋ก์ ์ ํจ๊ป AnonymousObservable์ ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋๋ค.
์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ฉด์ ์ธ์๋ก ์ ๋ฌ๋๋ subscribeHandler๋ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ๊ทธ ํด๋ก์ ๊ทธ๋๋ก๊ฒ ์ฃ !
์ ๊ทธ๋ผ ๋๋ง์ ์ run ๋ฉ์๋๊ฐ ์ธ์ ํธ์ถ๋๋์ง ์์์ผ๋๋๋ฐ, ์๊ณ ๋ณด๋๊น AnonymousObservable์ด ์์ํ๊ณ ์๋ ํด๋์ค๊ฐ ์๋๋ผ๊ตฌ์.. ๋ฐ๋ก Producer ์
๋๋ค!
์ ๊น.. Producer๋ถํฐ ๋ณด์!
Producer๋ Observable์ ์์ํ๊ณ ์๊ณ , RxSwift์ ๋ชจ๋ Operator๋ค์ ์ด ํด๋์ค๋ฅผ ์์ํ๊ณ ์์ด์! ์์ ์์๋ run ๋ฉ์๋๋ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์์ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ฉ์๋์์ต๋๋ค.
์ด์ run์ด ์ธ์ ๋ถ๋ฆฌ๋์ง ์ ์ ์๊ฒ๋์๋๋ฐ์, ๊ตฌํ๋ subscribe์ ๋ด๋ถ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
subscribe๊ฐ ํธ์ถ๋๋ฉด ์ด๋ค ์ค์ผ์ค๋ฌ์ด๋ ์ง ์๊ด์์ด ํ๋ ์ผ๋ค์ด ์๋๋ฐ์, SinkDisposer ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ run ๋ฉ์๋๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ sinkAndSubscription์ ๋ง๋ ๋ค์ disposer์ sink์ subscription์ ๋ฃ์ด์ฃผ๊ณ ๋ฐํํด์ค๋๋ค.
์๊น run ๋ฉ์๋์ ๋ฐํํ์
์ด sink์ subscription์ด๋ผ๋ ์ด๋ฆ์ ๋ Disposable์ด์์ฃ ! ์ฌ๊ธฐ์ ํผ์ฆ์ด ๋ง์ถฐ์ง๋ค์..!
๊ทธ๋ผ SinkDisposer๊ฐ ๋ญ์ง ๋ ๋ด์ผ๊ฒ ์ฃ ?
๋ค๋ฅธ๊ฑด ๋ณต์กํ๋๊น ์๋ณด๊ณ setSinkAndSubscription์์ ๊ฒฐ๊ตญ ํ๋ ์ผ์ ํ์ฌ ์ธ์คํด์ค์ sink์ subscription์ Disposable๋ค์ ๋ฃ์ด์ฃผ๋๊ฑฐ์์.
๋ญํ๋ฌ ์ด๋ ๊ฒ ํ๋ ํ๋๋ SinkDisposer์ ํ๋กํ ์ฝ์ด Cancelable์ด๋ค์..
Cancelable์ isDisposed ํ๋กํผํฐ๋ฅผ ์ ๊ณตํด์ ๊ตฌ๋
์ํ๋ฅผ ํ์ธํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๊ณ , ์ด ์์์ ์๋ ํ๋กํ ์ฝ์ด ์ฐ๋ฆฌ๊ฐ ์ต์ข
์ ์ผ๋ก ์ ๋ฌ๋ฐ๋ Disposable์
๋๋ค. ์ฌ๊ธฐ์ dispose ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ฃ .
์ ์ด์ ์ด๋์ ๋ ์ ๋ฆฌ๊ฐ ๋์์ต๋๋ค.
๋ค์ ์ฝ๋๋ก
Observable<String>.create({ (observer) -> Disposable in
observer.onNext("1") return Disposables.create()
})
๋ค์ ์ด create ๋ก ์๋ก์ด ์ต์ ๋ฒ๋ธ์ ๋ง๋๋ ์ฝ๋๋ก ์๋ณผ๊ฒ์. create๋ฅผ ํ๋ฉด์ ์ ๋ฌํ ํด๋ก์ ๊ฐ AnonymousObservable์ ์ ๋ฌ์ด ๋๋ค๊ณ ํ์ฃ ? ๊ทธ๋ผ AnonymousObservable์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๊ทธ๋๋ก ๋ฐํ๋ฉ๋๋ค.
let observable = Observable<String>.create({ (observer) -> Disposable in
observer.onNext("1") return Disposables.create()
})
observable.subscribe( onNext: { data in print(data) })
๊ทธ๋ฆฌ๊ณ ์ด AnonymousObservable์ subscribeํ๋ฉด, Producer์ ์๋ subscribe ๋ฉ์๋๊ฐ ์คํ๋์ฃ .
์ ๊ทผ๋ฐ subscribe์ ํ๋ผ๋ฏธํฐ ํ์ ์ Observer์ธ๋ฐ, ์ฐ๋ฆฌ๋ ์ด๋ฐ๊ฑฐ ์ค ์ ์ด ์๋๋ฐ์..?
ObservableType+Extension ํ์ผ์ ์ด์ด๋ณด๋ฉด ์ด๋ฐ๊ฒ ์๊ฑฐ๋ ์! ์ฐ๋ฆฌ๋ ๊ฐ ์ด๋ฒคํธ์ ๋ํ ํธ๋ค๋ง ํด๋ก์ ๋ง ์ ๋ฌํด์ฃผ์ด๋ ๋ด๋ถ์ ์ผ๋ก AnonymousObserver๋ฅผ ์์ฑํด์ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ Observer๋ฅผ ๊ฐ์ ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ณ ์์๋๊ฑฐ์ฃ ..!
๊ทธ๋ผ run๋ฉ์๋๊ฐ ์คํ๋๋ฉด ์ด AnonymousObserver๊ฐ ์ ๋ฌ์ด ๋๊ฒ ์ฃ ?
์ด ๋ถ๋ถ์
๋๋ค! cancel์๋ ์๊น ๋ง๋ค์๋ disposer๊ฐ ๋ค์ด๊ฐ๋๋ค!
์ด์ AnonymousObserverSink ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๊ณ , ๋ด๋ถ์ ๋ค์ด๊ฐ observer๊ฐ on์ด ๋ถ๋ ธ์ ๋ forwardOn์ด ๋ถ๋ฆฌ๋ฉด์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํด๋ก์ ์ onNext๋ฅผ ์คํํด์ค๊ฑฐ์์.
subscription์ sink.run(self)๋ก ๋ง๋ค์ด์ง๋๋ฐ์, ์ฌ๊ธฐ์ self๋ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ํด๋ก์ ๋ฅผ ํตํด ๋ง๋ค์ด์ง AnonymousObserver์ด๊ณ self๋ ์ง๊ธ ๊ตฌ๋
ํ๋ ค๋ Observable์ด์์. observable.subscribe๋ก ๋ถ๋ ์ผ๋๊น์.
๊ทธ๋ผ ์ด ์น๊ตฌ๊ฐ ์คํ์ด ๋ ํ
๋ฐ์, ์ฌ๊ธฐ์ parent๋ ๋ฐํ์๊ฐ๋ Observable์ด๊ฒ ์ฃ ? ์๊ฐ ๊ตฌํํ๊ณ ์๋ subscribeHandler, ์ฆ create์์์ ๋ง๋ค์๋ ๋ฐฉ์ถ์ฝ๋๊ฐ ์คํ์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ ์ฃผ์ฒด๊ฐ AnonymousOberver๊ฐ ๋ฉ๋๋ค.
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด run์ด ํธ์ถ๋๋ฉด create์์ ๋ง๋ค์๋ ์ด๋ฒคํธ๋ค์ด ์คํ๋๋ฉด์ subscribe์์ ๋ง๋ ํด๋ก์ ๋ค์ด ์คํ๋๋ ๊ฒ์ด์ฃ .
์์์ ํ๋ฆ ์ ๋ฆฌ - 2
์ ์ ๋ ์ดํดํ์ง ๋ชปํ ์ค ์์๋๋ฐ ์กฐ๊ธ์ ์ดํด๊ฐ ๋์์ต๋๋ค.. ์ ๋ฆฌํด๋ณผ๊ฒ์
1. create๋ก ์ต์ ๋ฒ๋ธ์ ๋ง๋ค๋ฉด create ๋ฉ์๋๋ฅผ ํตํด ์์ฑ๋ AnonymousObservable์ด ๋ฐํ๋๋ค.
Observable<String>.create({ (observer) -> Disposable in
observer.onNext("1")
return Disposables.create()
})
2. ์ด ์ฝ๋์์ create ์์ ๋ค์ด๊ฐ ํด๋ก์ ๊ฐ AnonymousObservable์ subscribeHandler๋ก ์ง์ ๋๋ค.
3. subscribe ๋ฉ์๋๋ฅผ ์ด๋ค ์ต์ ๋ฒ๋ธ์ ๋ํด ํธ์ถํ๋ฉด์ ํด๋ก์ ๋ก onNext์ ๋ํ ํด๋ก์ ๋ฅผ ์ง์ ํ๋ฉด ObservableType์์ ์ด ํด๋ก์ ๋ค์ ํฌํจํ๋ AnonymousObserver๋ฅผ ๋ง๋ค๊ณ ๋ฐํ์์ ์์ ํด๋์ค์ธ Producer๊ฐ ๊ฐ์ง run ๋ฉ์๋์ ์ธ์๋ก ๋๊ฒจ ํธ์ถํ๋ค.
observable.subscribe( onNext: { data in print(data) })
// onNext: { data in print(data) } --> AnonymousObserver๋ก ์์ฑ ์ด๋ฆ์ AO๋ก ํ์.
// observable.subscribe(AO) ๊ฐ ๋๊ณ ,
// Producer์์๋ observable.run(AO, disposer)์ ํธ์ถ
4. Producer์์ ํธ์ถ๋ run์์๋ sink์ subscription์ ๋ง๋ ๋ค. sink๋ ์ด๋ฒคํธ์ ๋ํด ์ ์ํ ํด๋ก์ ๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ๋ฑ๋ก๋ disposable์ ๋ฐํํ๋ค. subsription์ AnonymousObservableSink ์ run ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
5. run ๋ฉ์๋๋ create์์ ๋ง๋ค์ด์ ๋ฑ๋ก๋ subscribeHandler๋ฅผ ํธ์ถํ๊ณ ๊ทธ ์ธ์๋ก subscribe ๋ฉ์๋์์ ๋ง๋ AnonymousObserver์ ์ ๋ฌํ๋ค.
Observable<String>.create({ (observer) -> Disposable in // ์ฌ๊ธฐ observer๊ฐ subscribe์์ ๋ง๋ค์ด์ง AnonymousObserver
observer.onNext("1")
return Disposables.create()
})
6. AnonymousObserver๋ก ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๊ณ ๋ด๋ถ์ on ๋ฉ์๋๋ฅผ ํตํด ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ค.
๋ง๋ฌด๋ฆฌ
๊ดํ ์์ํ๋ค..
์ฐ๊ณ ๋์ ๋ค์ ์ฝ์ด๋ณด๋๋ฐ ์ง์ง ์์์ ํ๋ฆ๋๋ก ์ ์ด๋จ๋ค์.. ๋์ค์ ์๊ฐ์ ๋ด์ ๋ค์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋คใ
๋ค๋ฅธ ์๋ฃ๋ฅผ ์๋ณด๊ณ RxSwift ๊นํ๋ธ๋ฅผ ๊ณ์ ํ๋ฉด์ ๊ณต๋ถํ๊ฑฐ๋ผ ์ Swift ์ง์์ด ์งง์ ์์ ํ ์ดํดํ์ง ๋ชปํ๊ณ ์ ์ ๋ด์ฉ๋ ์์ ์ ์์ด์ใ
ํน์ ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์๊ณ RxSwift์ ๋ด๋ถ ๋์์ ๋ํด ์ ์ ๋ฆฌ๊ฐ ๋ ์๋ฃ๊ฐ ์๋ค๋ฉด ์ถ์ฒํด์ฃผ์ธ์!
๊ธธ๊ณ ํผ๋์ค๋ฌ์ด ๊ธ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค~!
'๐ ์์ด-์ค-์์ค > โก๏ธ RxSwift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] subscribe์ ๋์์๋ฆฌ ์ดํดํ๊ธฐ (3) | 2022.01.24 |
---|---|
[RxSwift] Observable.create์ ๋์์๋ฆฌ ์ดํดํ๊ธฐ (0) | 2022.01.23 |
[RxSwift] Disposables.create() ์ ํ์ง? (0) | 2022.01.16 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote