ํฐ์คํ ๋ฆฌ ๋ทฐ
[RxSwift] #1) RxSwift ๊ฐ๋ ์ก๊ธฐ (๋ฑ์ฅ ๋ฐฐ๊ฒฝ + ๊ธฐ๋ณธ ๊ตฌ์กฐ)
ir.__.si 2023. 1. 26. 08:26ํด๋น ๊ธ์, ๊ณฐํ๊น๋์ [RxSwift 4์๊ฐ์ ๋๋ด๊ธฐ ์์ฆ2] ์์์ ๋ณด๋ฉด์ ์ค์ค๋ก ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
์๋ฌด๋๋ ๊ณต๋ถ ํ ๋ด์ฉ์ ์ ๋ฆฌํ๋ ๋ชฉ์ ์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์, ๋ด์ฉ์ ๋ํ ์์์ ์ธ ํด์์ด ๋ง์ด ๋ค์ด๊ฐ ์์ ์ ์์ต๋๋ค ๐ญ
๋ฐ๋ผ์, RxSwift๋ฅผ ์ ๋๋ก ๊ณต๋ถ ํด ๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ๊ณฐํ๊น๋์ ๊ฐ์๋ฅผ ์ง์ ๋ค์ผ์๋ฉฐ ๊ณต๋ถ ํด ๋ณด์๋๊ฒ์ ์ถ์ฒ ๋๋ฆฝ๋๋ค!!!
RxSwift ๊ฐ๋ ์ก๊ธฐ (๋ฑ์ฅ ๋ฐฐ๊ฒฝ + ๊ธฐ๋ณธ ๊ตฌ์กฐ)
์ข์ธก์ ์ฝ๋๋ฅผ ๋์ ์์ผ์, ์ฐ์ธก๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๊ณ ์ถ๋ค. ์ด๋, ์ ์์ ์ผ๋ก ๋์ ํ๋ค๋ฉด
1. ์ธ๋์ผ์ดํฐ UI๋ ธ์ถ
2. ์๊ฐ์ ๊ณ์ ํ๋ฌ๊ฐ
3. ๋ฐ์ดํฐ ๋ฐ์์ค๋ฉด text๋ก ํํ
์ด 3๊ฐ์ง์ ๋์์ด ๋์์ ์ด๋ค์ ธ์ผํ์ง๋ง,
์ค์ ๋ก๋ ์ธ๋์ผ์ดํฐ๋ ๋ ธ์ถ์ด ์๋๊ณ ๋คํธ์ํน ๋์์ด ์ผ์ด๋๋ ๋์ ์๋จ์ ํ์ด๋จธ์ Label ๋ณ๊ฒฝ๋ ์ ์ง๋๋ค.
๊ทธ ์ด์ ๋ฅผ ์ดํดํ๊ธฐ ์ ์ ์๋์ ๋ด์ฉ์ ๋จผ์ ์๊ณ ์์ด์ผํ๋๋ฐ, ๊ทธ ๋ด์ฉ์
iOS๋ ๋ฐ๋ก thread๋ฅผ ๋ช ์ํ์ง ์์ผ๋ฉด main thread๋ก ๋์ํ๊ณ , main thread๋ ๋๊ธฐ์ ์ผ๋ก ์งํ๋๋ค
๊ทธ๋ ๊ธฐ๋๋ฌธ์, main thread์์ json์ ๋ฐ์์ค๋ ๋คํธ์ํน ์์ ๋์, ๋ค๋ฅธ ๋ชจ๋ UI์์ ๋ค์ ํ์์๋ก ๋ฐ๋ ค๋๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๊ฐ ์์ ๋ค์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ ํด ์ค์ผ ํ๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ global thread๋ก ๊ฐ๋ฐ์๊ฐ ์ง์ thread๋ฅผ ๋ถ๋ฆฌ ํด์ค์ผํ๋ค.
๋ํ, UI๋์์ main thread์์๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ UI๋์์ ๋๋ค์ main thread๋ก ๋ถ๊ธฐ ํด์ค์ผํ๋ค.
onLoad()ํจ์๋ฅผ ์์๊ฐ์ด ๋ณ๊ฒฝ ํด์ฃผ๋ฉด, ๋ชจ๋ ๋์์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
ํ์ง๋ง, ๊ตฌํ๋ถ์ 1) ๋คํธ์ํน ์์ ๊ณผ 2) DispatchQueue์ ๊ฐ์ ๊ธฐ๋ฅ์ด ๋ค์ด๊ฐ์์ผ๋ฉด
์ฝ๋๊ฐ ์ง์ ๋ถ ํด๋ณด์ด๋ ์์ downloadJson(_ url: ) ์ด๋ผ๋ ์๋ก์ด ํจ์๋ก ๋นผ๋ฒ๋ฆฌ์.
๊ทธ๋๋ก ํจ์๋ก ์๋ก ๋ง๋ค๊ณ return๊ฐ์ String? ํ์ ์ผ๋ก ๊ฒฐ์ ํ ํ, return์ ํด ์ฃผ๋ฉด
์์ ๊ฐ์ด, '๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ๋ฆฌํด๊ฐ์ ์ ๊ณตํ ์ ์๋ค' ๋ผ๋ ์๋ฌ๊ฐ ๋ฌ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋น๋๊ธฐ๋์์ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅผ ๋, escaping closure๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ escaping closure๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด
1) ๋น๋๊ธฐ์ ์ธ ๋์์ด ์ฌ๋ฌ๊ฐ ์ฎ์ฌ ์๋ ๊ฒฝ์ฐ, ์ค๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ๋ถ๋ถ์ ๋ฐ๊ฒฌํด์ ์ฒ๋ฆฌํ๊ธฐ ํ๋ค๊ณ
2) ์ฝ๋๊ฐ ๋งค์ฐ ๋๋ฌ์์ง๋ค.
๊ทธ๋์ ์ฌ๋๋ค์ '์ด๋ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฅ ๋ฆฌํด๊ฐ์ผ๋ก ์ ๋ฌ ํด ์ค ์ ์๋ ๋ฐฉ๋ฒ์ ์์๊น?' ๋ผ๋ ๊ณ ๋ฏผ์ ํ์๊ณ
๊ทธ๊ฒ์ ํด๊ฒฐ ํด ์ฃผ๊ธฐ ์ํ ์ ํธ๋ฆฌํฐ๊ฐ ๋์๋๋ฐ, ๊ทธ ์ค ํ๋๊ฐ RxSwift์ด๋ค.
์ฆ, RxSwift๋ [๋น๋๊ธฐ์ ์ผ๋ก ์๊ธฐ๋ ๋ฐ์ดํฐ (Observable<T>)]๋ฅผ [ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ํ ์์ ์ ์ฒ๋ฆฌ(.subscribe)]๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์ ํธ๋ฆฌํฐ ์ด๋ค.
์ ์ด๊ฒ์ผ๋ก RxSwift ์ค๋ช ์ ๋ง์น๋๋ก ํ๊ฒ ๋ค!!!!!
.
.
.
.
.
์ฌ์ค ๋ง๋ ๋ง์ด๊ธด ํ์ง๋ง,
๋ฐฅ์ ํ๋๋ฐ ์ด๋ป๊ฒ, ์๊ณผ ๋ฌผ์ด ํ์ํ๋ค๋ ๊ฒ๋ง ์๋ฉด ๋ง์๋ ๋ฐฅ์ ์ง์ ์ ์์ผ๋ด~
์๋ฆฌ์ ๋ฐฉ๋ฒ์ ์์์ผ ๋ง์๋ ๋ฐฅ์ด ๋์ค์ง!!!
์ฐ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ RxSwift์ ๋์์๋ฆฌ๋ฅผ ์์๋ณด์
1. [Observable] ํํ๋ก ๊ฐ์ธ๋ ๋ฐ์ดํฐ๋ '๋์ค์ ์๊ธฐ๋ ๋ฐ์ดํฐ' ๋ผ๋ ๊ฒ!!
2. ๋ํ, '๋์ค์ ์๊ธด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ' ํ๊ธฐ ์ํด์๋ [.subscribe]๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
3. ๊ทธ๋ฌ๋ฉด, event๊ฐ ๋ฐ์ํ๋๋ฐ, 3๊ฐ์ง๋ก ๋๋๋ค. (.next / .completed / .error)
๋ค์ํ๋ฒ ๊ฐ์กฐํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ RxSwift๋ฅผ ๋ฐฐ์ด๋ค๋ ๊ฒ์
1. ๋น๋๊ธฐ๋ก ์๊ธฐ๋ ๋ฐ์ดํฐ๋ฅผ Observable๋ก ๊ฐ์ธ์ ๋ฆฌํดํ๋ ๋ฐฉ๋ฒ
2. Observable๋ก ์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
์ด 2๊ฐ์ง๋ฅผ ๊ณต๋ถ ํ๋ค๋ ๊ฒ์์ ์ ์ํ์. (์ฆ, ์ด ๋๊ฐ์ง๋ง ์ ๋ค๋ฃจ๋ฉด RxSwift๋ ๋ง์คํฐ ํ ์ ์๋ค๋ ๋ง~)
๊ทธ๋ ๋ค๋ฉด, ์์ 2๊ฐ์ง๋ฅผ ์ ์ฉํ์ฌ ์ค์ ์ฝ๋๋ฅผ ์์ฑ ํด๋ณด์
1. ๋น๋๊ธฐ๋ก ์๊ธฐ๋ ๋ฐ์ดํฐ๋ฅผ Observable๋ก ๊ฐ์ธ์ ๋ฆฌํดํ๋ ๋ฐฉ๋ฒ
URLSession์ ์ฌ์ฉํ์ฌ Observable์ create ํด๋ณด์๋ค.
์๋ฅผ ๋ณด๋ฉด ์ ์ ์์ง๋ง, error๊ฐ ๋ฐ์ํ๋ฉด emit.OnError๋ก ํด๋น error๋ฅผ ๋ณด๋ด์ฃผ๊ณ , data๊ฐ ์ ๋๋ก ์์ผ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ
String์ผ๋ก ๋ณํํ์ฌ onNext๋ก ๋ฟ๋ ค์ค๋ค.
์ดํ ๋์์ด ๋ง์น๋ฉด onCompleted๋ก Observable์ deinit ํด์ค๋ค.
๊น๋ํ๊ฒ Observable์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ ๋ฆฌ ํด ๋ณด์๋ฉด
1. Create
2. Subscribe
3. onNext
4. onCompleted / onError
5. Disposed
์์ ์์๋ฅผ ๋ณด๋ฉด ์ง์ ํ ์ ์์ง๋ง, Observable์ Createํ๋ค๊ณ ํด์ ํด๋น Observable์ด ๋ฐ๋ก ๋์ ํ๋ ๊ฒ์ ์๋๋ค.
Observable์ด subscribe๊ฐ ๋์ด์ผ๋ง, ๋น๋ก์ ๋์๋ค์ ์คํํ๋ค.
๋ํ onNext๊ฐ ๋ชจ๋ ์งํ ๋๊ณ , onCompleted / onError์ ์ํด Disposed๋ Observable์ ์ ๋ ์ฌ์ฌ์ฉ๋์ง ์๋๋ค.
-> Observable์ ๋ํ subscribe๋ฅผ ๋ค์ ์งํํด์ผ๋ง, ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
2. Observable๋ก ์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
์ ๊ทธ๋ฆผ์ Observable์ ์ฒ๋ฆฌ(.subscribe)ํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก, subscribe๋ฅผ ํตํด์ event๋ฅผ ๋ฐ๊ณ .next / .error / .completed ๋ฅผ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ subscribe์ ๋ฆฌํดํ์ ์ธ Disposable์ ๋ํ dispose()๋ฅผ ํธ์ถํ์ฌ ๋ง๋ฌด๋ฆฌํ๋ค.
+ ์ถ๊ฐ์ ์ผ๋ก, closure๋ฅผ ์ฌ์ฉํ๋ฉด์ observable์ ๋ํ ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๊ฒ๋๋๋ฐ, ์ด ์ํ ์ฐธ์กฐ๋ event๋ผ๋ observable์ด ์ข ๋ฃ๊ฐ ๋์ด์ผ ์ฌ๋ผ์ง๋ค. ์ด๋, ์์์ ์ค๋ช ํ๋ฏ์ด observable์ ์ข ๋ฃ ์กฐ๊ฑด์ onCompleted / onError / Disposed ๋์์ ๋ ์ด๋ค.
๊ทธ๋ผ, ์ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋์ง ์๋๋ ๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง....๊ทธ๋ฅ ๋ง ํธํ๊ฒ event ์์ [weak self] ๋ถ์ด๋๋ก ํ์,,,,
'๐ > RxSwift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] #6) RxSwift + MVVMํจํด [RxCocoa๋ฅผ ํ์ฉํ UITableView ๊ตฌ์ฑ] (2) | 2023.02.01 |
---|---|
[RxSwift] #5) RxSwift + MVVMํจํด [Subject๋ฅผ ํ์ฉํด๋ณด์] (0) | 2023.01.30 |
[RxSwift] #4) Subject๋ ๋ฌด์์ผ๊น? (1) | 2023.01.29 |
[RxSwift] #3) RxSwift + MVVMํจํด [๊ธฐ๋ณธ ํ๋ก์ ํธ ๊ตฌ์ฑ] (0) | 2023.01.29 |
[RxSwift] #2) Operator๋?? + ReactiveX ๋ฌธ์๋ณด๋ ๋ฒ (2) | 2023.01.28 |