[RxSwift] Disposables.create() ์ ํ์ง?
Disposables.create ๋ถ์ํด๋ณด๊ธฐ
Rx๋ฅผ ํ๋ฉด์ ๋ง์ด ๋ค์๋ ์๋ฌธ..
let numbers = Observable<Int>.create { observer in
observer.onNext(1)
observer.onNext(2)
observer.onNext(2)
return Disposables.create()
}
์ฌ๊ธฐ์ ๋ง์ง๋ง์ Disposables.create()๋ฅผ ์ ํ์ง??
๊ทธ๋ฅ ๋จ์ํ "๋ฐํํ์ ์ด Disposable ์ด๋๊น"๋ ๋ง์ด ์๋๋ ๊ฒ ๊ฐ์์ ์ด๋ฒ์๋ ์์์ ํ๋ฆ๋๋ก ์ฝ๋๋ฅผ ํ ๋ฒ ๋ฏ์ด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
Disposables
๋จผ์ Disposables.create๋๊น ํ์ ๋ฉ์๋์ธ ๊ฒ ๊ฐ์์ Disposables๋ฅผ ์ฐพ์๋ณด๊ธฐ๋ก ํ์ด์.
Rx ์ ์ฅ์์ ๋ค์ด๊ฐ๋ณด๋ฉด Disposables๋ผ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์๋ค์. ์ ๊ธฐ๋ก ๊ฐ๋ณด์ฃ !
๊ทธ๋ผ ์ด๋ ๊ฒ ์์ฒญ๋๊ฒ ๋ง์ Disposable์ ๊ตฌ์ฒดํ์ ์ผ๋ก ์ถ์ ๋๋ ํ์ผ๋ค์ด ๋ฑ์ฅํ๋๋ฐ์, ๊ฐ์ฅ ๋ง๋งํด๋ณด์ด๋ Disposables.swift๋ฅผ ์ด์ด๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฅ ๊ตฌ์กฐ์ฒด์๋ค์.. ํ ๊ฐ์ง ์ถ์ ํด๋ณผ ์ ์๋๊ฑด ํด๋์ค๊ฐ ์๋๋๊น ์ผ๋จ ์๋ธํด๋์ฑ์ผ๋ก ๊ตฌ์ฒดํ์ ๋ค์ด ๋ง๋ค์ด์ง์ง๋ ์์ ๊ฒ ๊ฐ๊ณ , ํ๋กํ ์ฝ๋ ์๋๋๊น ์๋ฅผ ์ธํฐํ์ด์ค ์ผ์์ ๋ญ๊ฐ๋ฅผ ํ์ง๋ ์๊ฒ ์ฃ ?
๊ทธ๋์ ๋ ์๊ฐ. '์! Disposable ํ์ผ๋ง๋ค Disposables์ Extension์ด ์๊ฒ ๊ตฌ๋..!'
๊ทธ๋ฆฌ๊ณ Extension์์ create๋ฅผ ์ํ๋๋๋ก ๊ตฌํํ๊ณ ์์ ๊ฒ์ด๋ผ๊ณ ์ถ์ ํ ์ ์์ ๊ฒ ๊ฐ์์.
์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์ถ์ create๋
let numbers = Observable<Int>.create { observer in
observer.onNext(1)
observer.onNext(2)
observer.onNext(2)
return Disposables.create()
}
์๋ ์์ด๋๊น ์ธ์๋ฅผ ๋ฐ์ง ์๋ create๊ฐ ๊ตฌํ๋ extension์ ์ฐพ์๋ณด๋ฉด ๋๊ฒ ์ฃ ?
Disposables.create() ์ฐพ์๋ณด๊ธฐ
ํ์ผ ๋ช ๊ฐ๋ฅผ ๋ค์ด๊ฐ๋ณด๋ ์ ์ถ์ธก์ด ๋ง์์ด์!
์๊น ๋๋ ํ ๋ฆฌ์์ ๋ดค๋ ์ฌ๋ฌ Disposables ์ ๊ตฌ์ฒด ํ์ ๋ค์ด ๋ด๋ถ์ create ํ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ์์์ต๋๋ค. ์ผ๋จ ์ด ์น๊ตฌ๋ create์์ ์ธ์๋ฅผ ๋ฐ๊ณ ์์ผ๋๊น ์ธ์๊ฐ ์๋ ํ์ผ์ ์ฐพ์๋ณผ๊ฒ์.
๋ชฉ๋ก์ ์๋ Disposable ์ค์ NopDisposable.swift ๋ผ๋ ํ์ผ์ด ์์๋๋ฐ์, ๋ด๋ถ์์ ์ธ์๋ฅผ ๋ฐ์ง ์๋ create ๋ฉ์๋๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค.
ํจ์ ๋ฐ๋๋ฅผ ๋ณด๋ฉด NopDisposable์ ํ์ ํ๋กํผํฐ์ธ noOp๋ฅผ ๋ฐํํ๊ณ ์๋๋ฐ์, ์ด ํ๋กํผํฐ๋ ๊ทธ๋ฅ NopDisposable์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ณ , ์ด ์ธ์คํด์ค์ dispose ๋ฉ์๋๋ ๋น์ด์์ต๋๋ค. ๊ฒฐ๊ตญ ๋์ค์ dispose๊ฐ ํธ์ถ๋์ด๋ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ์ด์ฃ .
์ง๋ ํฌ์คํธ์์ Observable์ create๋ฅผ ํธ์ถํ๋ฉด ์ดํ ํด๋ก์ ์ ์ ์๋ subscribeHanlder๋ฅผ ๊ฐ์ง AnonymousObservable์ ๋ง๋๋ ๊ฒ์ ํ์ธํ๋๋ฐ์, subscribe๋ฅผ ํตํด ์ด ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ ํ๋ฉด ์ํ์ค๋ฅผ ์ทจ์ํ ์ ์๋ Disposable์ด ๋ฐํ๋์์ฃ .
ํ์ง๋ง ์์์ ์ ์ํ ์ต์ ๋ฒ๋ธ์ ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ์์ ์ด ์์ผ๋ ๋ฐ๋ก ์ทจ์ํ์ง ์์๋ ์ํ์ค๊ฐ ์ทจ์๋๋ฉด ๋ชจ๋ ์์ ์ด ์ข ๋ฃ๋๋๊น ๋ฐ๋ก ๋์์ด ํ์์๋ ๋น disposable์ ๋ฐํํด์ฃผ์ด๋ ๋๋ ๊ฒ์ด์์ต๋๋ค.
๋น๋๊ธฐ ์์ ์ด ์กด์ฌํ๋ Observable์ create
๋ง์ฝ ๋น๋๊ธฐ ์์ ์ด ์กด์ฌํ๋ค๋ฉด ์ด์ผ๊ธฐ๊ฐ ์กฐ๊ธ ๋ค๋ฅด์ฃ . ์ํ์ค๊ฐ ์ค๋จ๋์ด๋ escaping์ผ๋ก ๊ตฌ์ฑ๋ ๋น๋๊ธฐ ์์ ์ ๊ณ์ ์คํ๋ฉ๋๋ค.
์ด ์ฝ๋๋ ํ๋ก์ ํธ์์ ์ค์ ๋ก ์ฌ์ฉํ๋ ์ฝ๋์ธ๋ฐ์, ์ง๊ธ๋ณด๋ ๊ทธ๋ฅ single์ ์ฐ๋ฉด ๋๋๋ฐ ์ Result๋ฅผ Observable๋ก ๋ํํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์..
์ฌํผ ์ด ์ฝ๋์์๋ create์ ์ธ์๋ก ํด๋ก์ ๋ฅผ ์ ๋ฌํ๊ณ ์์ด์. dispose๋๋ฉด ์งํ์ค์ด๋ URLSession ํ์คํฌ๋ฅผ ์ค๋จํ๋ ค๋ ์๋์์ฃ .
๊ทธ๋ผ ํด๋ก์ ๋ฅผ ์ธ์๋ก ๋ฐ๋ Disposables.create๋ฅผ ์ฐพ์๋ด ์๋ค!
์ฌ์ค ์๊น ์ฐ์ฐํ ์คํฌ๋ฆฐ์ท์ผ๋ก ์ฒจ๋ถํ๋ create๊ฐ ์ ๋ต์ด์๋ค์ใ ใ
์ด๋ฒ์๋ AnonymousDisposable.swift๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค!
create ๋ฉ์๋๋ฅผ ํ์ธํ๊ธฐ ์ ์ ๋ด๋ถ ๊ตฌ์ฑ์ ๋ณด๋ฉด, ์๊น๋ณด๋ค๋ ์กฐ๊ธ ๋ณต์กํด์ก์ด์.
ํ์ง๋ง ๋์ ๋๋ DisposeAction์ด ์๋ค์. ์์ฑ์์์ escaping ํด๋ก์ ๋ฅผ ๋ฐ์์ disposeAction ํ๋กํผํฐ์ ๋ฃ์ด์ฃผ๊ณ ์๋ค์.
๊ทธ๋ฆฌ๊ณ ์๋ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ dispose ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด disposeAction์ ์ต์ ๋ ๋ฐ์ธ๋ฉํด์ ํธ์ถํ๊ณ ์์ต๋๋ค. ์ด ๋ง์ ๊ณง dispose๊ฐ ํธ์ถ๋ ๋ ์์ฑ์๋ก ์ ๋ฌ๋ ํด๋ก์ ๊ฐ ๊ทธ๋๋ก ์คํ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด์ ์ฃผ์ธ๊ณต์ธ create ๋ฉ์๋๋ฅผ ๋ณผ๊น์? create์ ํจ๊ป ์ ๋ฌ๋ ํด๋ก์ ๋ฅผ ์ธ์๋ก AnonymousDisposable ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ Cancelable ํ์ ์ผ๋ก ๋ฐํํ๊ณ ์์ต๋๋ค.
๊ฐ์๊ธฐ Cancelable์ด ๋์๋ค๊ณ ๋นํฉํ์ง ๋ง์ธ์!
Cancelable์ Disposable์ ์ฑํํ๋ ํ๋กํ ์ฝ์ด์์. Disposable์์ ์ถ๊ฐ์ ์ผ๋ก ํ์ฌ Disposable์ด dispose ๋์๋์ง ํ์ธํ ์ ์๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ๊ณตํ๊ณ ์์ด์. ์ด์ฐจํผ ์์ ํ๋กํ ์ฝ์ด Disposable์ด๋๊น DisposeBag์ ๋ด๋๋ฐ๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์๊ฒ ์ฃ !
์ ๊ทธ๋ผ ์ข ํฉํด๋ณด๋ฉด ์ด๋ ๊ฒ ํด๋ก์ ๋ฅผ ์ ๋ฌํ๋ ์ํฉ์์๋ dispose๊ฐ ๋ถ๋ฆด ๋ ์คํํ ํด๋ก์ ๋ก ๋ฑ๋ก์ ํด๋๊ณ , dispose๊ฐ ํธ์ถ๋๋ฉด ํด๋น ํด๋ก์ ๋ฅผ ํธ์ถํด์ฃผ๋ ๊ฒ์ด์๋ค์.
๋ง๋ฌด๋ฆฌ
Observable ์ฝ๋๋ฅผ ์ฝ์ ๋๋ ์ ๋ง ํผ๋ ๊ทธ ์์ฒด์๋๋ฐ, Disposable์ ๊ฝค๋ ๊น๋ํ์ต๋๋ค! ์ญ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด,
1) Disposables์ ๋ด๋ถ์ ๊ตฌํ์ด ์๋ฌด๊ฒ๋ ์๋ ๊ตฌ์กฐ์ฒด์ด๋ค.
2) Disposable์ ๊ตฌ์ฒดํ์ ๋ค์ ํ์ผ ๋ด๋ถ์ Disposables ์ Extension์ ๊ฐ๊ฐ ๊ฐ์ง๊ณ ์๋ค.
3) Disposables.create์์ ์๋ฌด๊ฒ๋ ํ์ง ์์ผ๋ฉด NopDisposable ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ค. ์ด ์ธ์คํด์ค์ dispose๋ ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค.
4) Disposables.create์ ํด๋ก์ ๋ฅผ ํ๋ ์ ๋ฌํ๋ฉด AnonymousDisposable ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ค. ์ด ์ธ์คํด์ค์ dispose๋ ์์ฑ๋ ๋ ๋ฑ๋กํด๋ ํด๋ก์ ๋ฅผ ์คํํ๋ค.