์ ๋ง ์์ด๋ณด,, ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ ์ฅ์์ ๊ฐ์ ์์์ ๋ณด๊ณ ์์์ ํ๋ฆ๋๋ก ์์ฑํ ๊ธ์ด๋ ๋นํ์ ๋์ผ๋ก ๊ธ์ ์ฝ์ด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค~~ ์ค๋ฅ ์ง์ ๋ํ์!
Observable Life-Cycle
1. Create
Observable
์์ฑ- ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๊ฑฐ๋, ์ด๋ค ๋ช
๋ น์ด ๋์ํ์ง ์์ → 2.
Subscribe
์์ ๋์!
2. Subscribe
- ์ด๋ ํ
Observable
์ด ๋์ํจ
3. Next
- ๋ฐ์ดํฐ ์ ๋ฌ
4. Completed
- ์ ์์ ์ผ๋ก ๋์ ๋
4-1. Error
- ๋น์ ์์ ์ผ๋ก ๋์ ๋
5. Disposed
Dispose
๋๋ฉด ๊ทธObservable
์ ๋ ์ด์ ์ฌ์ฌ์ฉ ๋ถ๊ฐ
.debug()
๋ก Observable ์ํ ํ์ธ ๊ฐ๋ฅ
์ํ ์ฐธ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
.subscribe(onNext: { i in
self.countLabel.text = "\(i)"
})
.disposed(by: disposeBag)
์ด ์ฝ๋์์ subscribe
๋ด์์ UI ์์
์ ํ๋๋ผ self
(ViewController)๋ฅผ ์ฐธ์กฐ. ์ด๋ฏธ VC ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด์ ํ ๋ฒ ์ฐธ์กฐ๋ ๊ฒ์. VC๊ฐ pop ๋๋๋ผ๋ ์ ํด๋ก์ ์์ ํ ๋ฒ ์ฐธ์กฐ๋ ๊ฒ ๋จ์ ์์! (4๋ฒ์ RC=1) ์ด VC ์ธ์คํด์ค๋ ๋ ์ด์ ์ ์ฐ๋๋ฐ...→ ์ํ ์ฐธ์กฐ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฝํ ์ฐธ์กฐ(weak self
)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, onCompleted()
๋ฅผ ํตํด Subscribe
ํด๋ก์ ์์ฒด๋ฅผ ์ข
๋ฃ์ํจ๋ค.
- ์ฝํ ์ฐธ์กฐ(weak self)
.subscribe(onNext: { [weak self] i in
self.countLabel.text = "\(i)"
})
.disposed(by: disposeBag)
weak self
๋ฅผ ์ ์ผ์ ๋๋ ์๋์ผ๋ก ๊ฐํ ์ฐธ์กฐ(strong)๋ก ์ฌ์ฉ๋จ. weak self
๋ ์์ ์ฝ๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉฐ, ์ฐธ์กฐ๋ ๋ RC๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ค! ์์ ์ธ์คํด์ค๊ฐ ํด์ ๋๋ฉด(RC- -) ์๋ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์๊ฐ(RC=0).
subscribe
์ ํด๋ก์ ๋ฅผ ์ข ๋ฃ์ํค๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ:Observable
์ ๋ง๋ค ๋onCompleted()
๋ช ์
emitter.onNext(image)
emitter.onCompleted()
return Disposables.create()
๋ญ ์ด๋ฐ ์์ผ๋ก... onCompleted
๊ฐ ๊ผญ ์คํ๋๋๋ก ๋ช
์ํ๋ฉด Observable
๋์ ์์ฒด๊ฐ ์ข
๋ฃ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋จ.
์ค๋ ๋ ๋ถ๊ธฐ
DispatchQueue
,OperationQueue
๋ฅผ ์ฌ์ฉํ๋ ๋์observeOn
,subscribeOn
์ ์ฌ์ฉํจ! (DispatchQueue
,OperationQueue
๋ฅผobserveOn
,subscribeOn
๊ฐ ๊ฐ์ผ(wrapping) ๊ฐ๋ )
subscribeOn
- ํ ๋ฒ๋ง ์ฌ์ฉ ๊ฐ๋ฅ, ๊ตฌ๋ ์ ์์ํ ์ค๋ ๋ ์ง์
- subscribeOn์ด ์ง์ ๋ ์์น์ ์๊ด์์ด ์ฒซ ์ค๋ ๋๋ฅผ ์ง์ ํจ!
- ์์ ์๋ Stream์ ์ํฅ์ ์ค → ์ ์คํธ๋ฆผ(Up Stream)
observeOn
- ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ ๊ฐ๋ฅ, observeOn์์ ์ค๋ ๋๋ฅผ ์ง์ ํ ํ ๊ทธ ์๋๋ถํฐ์ Stream์ ์๋ → ๋ค์ด์คํธ๋ฆผ(Down Stream)
Stream์ ๋ถ๋ฆฌ ๋ฐ ๋ณํฉ
merge
- Observable 2๊ฐ๋ฅผ 1๊ฐ๋ก merge
- ํ๋๋ก ํฉ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํ์ ์ ํต์ผํด์ผ ํจ!
zip
- ์์ผ๋ก ๋ง๋ค์ด ์ ๋ฌ → ๋ฐ์ดํฐ ํ์ ๋ฌ๋ผ๋ ์๊ด X
1----2--------3---------4---->
B----------C---A------------->
########### zip ############
1B---------2C--3A------------>
- ๋ฐ์ดํฐ์ ๊ฐ์๋ ๊ฐ์ฅ ์์ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ ๊ฐ์์ ๋์ผ!
combineLatest
- zip๊ณผ์ ์ฐจ์ด์ : ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐ์ดํฐ์ ์์ ์ด๋ค ์ ๋ฌ
1----2--------3---------4---->
B----------C---A------------->
######### combineLatest #########
1B---2B----C2-3C--A3----4A--->