์ต๋ํ ๊ฐ๋จํ๊ฒ ์ค๋ช ํด๋ณด๋ RxSwift
iOS ๊ณต๋ถํ๋ ์ฌ๋์ ๋ฌด์กฐ๊ฑด ๋ค์ด๋ดค์ RxSwift
RxSwift๋ ReactiveX Swift์ธ๋ฐ์,
reactiveX ?
๋์ถฉ ํด์ํ๋ฉด ์ต์ ๋ฒ๋ธ์ ์ฌ์ฉํด์ ๋น๋๊ธฐ๋ event-based๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค
์ต์ ๋ฒ๋ธ์ด ๋ญ๋ฐ ?????
Observable ?
๋์ถฉ ํด์ํ๋ฉด
- ์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋
ํ๋ค
- ์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ด ๋ฐฉ์ถํ๋ items์ ๋ํด ๋ฐ์ํ๋ค
- ์ต์ ๋ฒ๋ ๋๊ธฐํ์ง ์๊ณ , ๋ฐ์ํ ์ค๋น๋ฅผ ํ ์ด๋ ํ ํํ๋ก ๊ธฐ๋ค๋ฆฐ๋ค
items์ด ์ด๋ค๊ฑด์ง๋ ๋ชฐ๋ผ๋ ์ผ๋จ ์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ด ๋ญ๊ฐ๋ฅผ ํ๋ฉด ๋ฐ์ํ๋!!
์ต์ ๋ฒ๊ฐ ๋ฌด์จ ํํ์ธ์ง๋ ๋ชฐ๋ผ๋ ์ผ๋จ ๋๊ธฐ ใดใด ์ฆ, sync ใดใด
๋ง์ ์ฉ์ด๋ค์ด ๋์ค๋๋ฐ Observer, Observable, Subscribe
๊ทผ๋ฐ ์ด ์ฉ์ด๋ค์ด Rx์ ์์๊ณผ ๋์ด๋ค!
์ต์ ๋ฒ๊ฐ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋ !! ํ๋๋ฐ ์ฐ๋ฆฌ๋ ์ด ๊ตฌ๋ !! ์ด ๋ญ์ง๋ฅผ ์์์ผ ํฉ๋๋ค. ์ด๊ฒ ํฌ์ธํธ์
RxSwift Concept
์ฐ๋ฆฌ youtube์์ ๊ตฌ๋ ์ด๋ผ๋ ๊ฒ์ ํ์์์?
๊ตฌ๋ ์ ํ๋ฉด ์ผ์ด๋๋ ์ผ์ ๐ฆถ๋ก ๊ทธ๋ ค๋ณด์์ด์
๋๋ ๊ตฌ๋ ์ ์ฆ, ์ต์ ๋ฒ์์
์ต์ ๋ฒ๋ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋ ํ๋ค๊ณ ํ์ฃ ? ๊ทธ๋ผ ์ ๋๊ฐ ์ต์ ๋ฒ๋ธ์ด ๋๊ฒ ๋ค์
๋ค์ ๋ํ๋ด๋ฉด,
์ฅ?? ๊ฐ์๊ธฐ onNext()? ๋ผ๊ณ ์๊ฐํ ์ ์๋๋ฐ ์ด์ ๋ถํฐ ์ดํด๋ณผ๊ฒ์..ใ ใ
์ฐ๋ฆฌ๊ฐ ์ ํ๋ธ์์ ๊ตฌ๋ ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ๋ ๋ฒํผ ๋๋ฅด๋ ๊ฑฐ์ฃ
RxSwift์์ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋ ํ๋ ๋ฐฉ๋ฒ์,
Observable.subscribe(event)
์ฐ๋ฆฌ๊ฐ ๊ตฌ๋ ๋ฒํผ์ ๋๋ฅด๊ณ ๋ฐ๋ผ๋๊ฒ์ "์ ์์์ด ์ ๋ก๋ ๋๋ฉด ์๋ฆผ" ์ด๊ฒ ์ฃ ?
Observable๋ฅผ ๊ตฌ๋ ํ ๋ ๋ฐ๋ผ๋ ์ ์ ์ ๊ธฐ event ์๋ฆฌ์ ํด๋ก์ ํํ๋ก ์ฐ๋ฆฌ๊ฐ ์ง์ !! ์์ฑํ ์ ์์ด์
๊ทธ๋ผ Observable์ด ์ด์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํด์ผ๊ฒ ์ฃ ? ์์ ์ ๋ก๋์ ๊ฐ์ ํ์๋ฅผ์!
๊ทธ๋์ Observable์ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์์
var jennie : Observable<String> = Observable.create { observer in
observer.onNext("์๋ก์ด ์์ ์
๋ก๋")
return Disposables.create()
}
์๊น ์์ ๊ทธ๋ฆผ์์ ์๋ก์ด ์์ ์ ๋ก๋ -> onNext()๋ก ๋ฐ๋์์์์!
observer.onNext()๋ผ๊ณ ํ๋ฉด ์ต์ ๋ฒ์๊ฒ ์ด๋ฒคํธ๋ฅผ ์ ์กํ๋๊ฑฐ์์! ๋ด๊ฐ ์ง๊ธ ๋ญ๊ฐ ๋ฐ๋์๋ค๋ ๊ฒ์์!!
์ด ์ฝ๋๋ "์๋ก์ด ์์ ์ ๋ก๋"๋ผ๋ ๋ฌธ์์ด์ ์ต์ ๋ฒ์๊ฒ ๋ณด๋ธ๋ค๋ ์๋ฏธ์ ๋๋ค
๊ทธ๋ผ ์์์ ๋งํ subscirbe์ ์ ๋๋ฅผ ๊ตฌ๋ ํ์ ๋์ ํ์๋ฅผ ์์ธํ ์์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค
jennie.subscribe(onNext: {
print("\($0)")
}).disposed(by: disposeBag)
disposed()๋ ๋๋๊ณ ํด์ํ๋ฉด
์ ๋๋ฅผ ๊ตฌ๋ ํ ๊ฑด๋ฐ onNext()์ด๋ฒคํธ๊ฐ ์ค๋ฉด ๋ฐ์ดํฐ๋ฅผ print๋ฅผ ํด์ค
๋ผ๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค!!
์ฌ๊ธฐ์๋ "์๋ก์ด ์์ ์ ๋ก๋" ๋ฌธ์์ด์ด ์ค๋ฉด print๋ฅผ ํด์ค๋ผ๊ณ ํด์ํ ์ ์๊ฒ ์ฃ ?!
์คํํด๋ณด๋ฉด subscribeํ์๋ง์ ๋ฐ๋ก ์๋ก์ด ์์ ์ ๋ก๋๊ฐ print ๋ผ์..?
UI ์ฝ๋๋ ๋ณธ๋ฌธ๊ณผ ๋ณ๋ก๊ด๊ณ๊ฐ ์์ด์ ์๋ตํ ๊ฒ์ ใ ใ !
???
๋ญ๊ฐ ์ด์ํ์ง ์๋์ ???
์ ๋๊ฐ ๋์ค์ ์์์ ์ ๋ก๋ ํ ์๋ ์๋๋ฐ ์ ๋๋ฅผ ๊ตฌ๋ ํ์๋ง์ ์๋ก์ด ์์์ ์ ๋ก๋ ํ๋ค๊ณ ํ์์์?!
๊ทธ ์ด์ ๋ create์์ onNext๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ด์์
์ ๋๋ฅผ ๊ตฌ๋ ์ ํ์๋ง์ create์์ ์๋ onNext()๊ฐ ์คํ๋๋ ๊ฑฐ์ฃ !
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด,
subscribe() -> create์์ ์์ฑํ ๋ด์ฉ ์คํ !!
๊ทผ๋ฐ Obervable์ ๊ทธ๋ ๊ฒ ๋ง๋ค์์.. create์์ onNext()๊ฐ ์๋๊ฑฐ์์... ๋ฐ์ ์์ ์๊ฐ ์์์...
๊ทผ๋ฐ ๊ตฌ๋ ์ ํญ์ ๋ฐ๋ก๋ฐ๋ก ์คํ๋๋ฉด ์๋๋๊ฑฐ์์!
๊ทธ๋ผ delayํ๋ฉด ๋์์!
var jennie : Observable<String> = Observable.create { observer in
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 3 ) {
observer.onNext("์๋ก์ด ์์ ์
๋ก๋")
}
return Disposables.create()
}
์ด๋ ๊ฒ ์ฐ๋ฉด ๊ตฌ๋ ํ๊ณ 3์ด๋ค์ ์๋ก์ด ์์์ ๋ฌด์กฐ๊ฑด ์ ๋ก๋ ํ๋๊ฑฐ์์์.. ์ ํด์ง ์๊ฐ ๋ง๊ณ ์ ๋๊ฐ ์ ๋ก๋ ํ๊ณ ์ถ์๋ ํด์ฃผ๋ ๋ง์ด์ผ
Subject
์ฐ๋ฆฌ๋ subject๋ฅผ ์ฌ์ฉํด์ ๋์ค์!!! ์๋ก์ด ์์ ์ ๋ก๋๋ฅผ ํ๊ฒ ํ ์ ์์ด์
subject์๋ ๋ค์ํ ์ข ๋ฅ๊ฐ ์๋๋ฐ ๊ทธ ์ค์์ PublishSubject๋ฅผ ์จ๋ณผ๊ฒ์
์๋ํ๋ฉด ์ ํ๋ธ ๊ตฌ๋ ์๋ฆฌ๋ ๋งค์ฐ ๋น์ทํ๊ฑฐ๋ ์ ใ ใ ใ
๊ทธ๋ฆผ์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ๊ตฌ๋ ํ ์์ ๋ถํฐ ๋ฐ์ํ ๋ฐ์ดํฐ๋ง ์ ๋ฌ์ ํ๋๊ฑฐ์์!
var jennie : PublishSubject<String> = PublishSubject()
๊ทธ๋ฆฌ๊ณ upload๋ฒํผ์ ํ๋ ๋ง๋ค์ด ์ค๊ฒ์
(UI ์ฝ๋๋ ์์์..ใ ใ )
๋ฒํผ์ ์ด๋ ๊ฒ ๋์ํ ๊ฑฐ์์
@objc func tapButton() {
jennie.onNext("์๋ก์ด ์์ ์
๋ก๋") //Observable์ธ๋ถ์์ onNext()์คํ
}
๊ทธ๋ฌ๋ฉด!! ๊ตฌ๋ ํ๊ณ , ๋ฒํผ์ ๋๋ ์ ๋ ์๋ก์ด ์์ ์ ๋ก๋๊ฐ ๋ํ๋๊ฒ ๋๊ฒ ์ฃ ?!
๊ตฌ๋ ์ํ๋ฉด ๋ฒํผ ๋๋ฌ๋ ์๋์์
Observable์ ๋๊ตฐ๊ฐ ๋๋ฅผ ๊ตฌ๋
ํ๋ฉด create์์ onNext()๊ฐ ๋ฐ๋ก ์คํ๋์ง๋ง,
Subject๋ ๊ตฌ๋
ํด๋ ์ฑ๋ก ์๋ค๊ฐ onNext()๊ฐ ์ธ๋ถ์์ ๋์ค์ ์คํ๋ ์ ์๋ค๋๊ฑฐ
์์ ์๋ ๊ทธ๋ฆผ์์ Observable -> Subject ํด์ค๊ฒ์
์ด์ ์ด ๊ทธ๋ฆผ์ด ๋์ถฉ.. ์ดํด๊ฐ ๋ ๊น์ ..?
๋ณธ๊ฒฉ์ ์ธ Rx๋ ์์๋ ์ํ๊ฑฐ์ง๋ง ๋๋๋ง ์์๋ณด๊ณ ๊ฐ๋๊ฑธ๋ก ํด์ ๐
ํ๋ฆฐ๋ด์ฉ์ด๋ ํผ๋๋ฐฑ์์ผ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค :)
'๐ฑ iOS > Base' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ NetworkManager๋ง๋ค๊ธฐ (feat. Generic) (3) | 2023.05.05 |
---|---|
[Swift] ์๋ฒ์ iOS ์ด๋ฏธ์ง ๋ณด๋ผ ๋ ์ฉ๋ ์ด์ & ํด๊ฒฐ (0) | 2023.03.23 |
[Swift] json value type์ด ๋ฌ๋ผ์ง๋ response์ ๋์ํ์ฌ API Responder๋ง๋ค๊ธฐ (0) | 2023.02.12 |
[Swift] Custom Calendar ๋ฌ์ ๋ง์ง๋ง ๋ ๊ตฌํ๊ธฐ (0) | 2023.01.16 |
[Stanford iOS] ์ํคํ ์ฒ & MVC (0) | 2022.05.05 |