๋ค์ด๊ฐ๊ธฐ์ ์
Rx, Reactive Programming์ด ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ด๋ผ๊ณ ์ด์ ์๊ฐ(Reactive Programming ํธ)์ ์ด์ผ๊ธฐํ๋๋ฐ ๊ทธ๋ผ ๋น๋๊ธฐ? ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด ๋ฌด์์ผ๊ฐ์? ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๋๋ก ํ์ฃ .
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ?
iOS ์ฑ์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ๋ฒํผ ํญ(ํด๋ฆญ)์ ๋ฐ์ํ๊ธฐ
- ํค๋ณด๋๋ฅผ ํ ์คํธ ํ๋๋ก ์ ๋๋ฉ์ด์ ํ๋ฉด ํฌ์ปค์ค๊ฐ ์ฌ๋ผ์ง
- ์ธํฐ๋ท์์ ํฐ ์ฌ์ง ๋ค์ด๋ก๋ → ๋ค์ด๋ก๋ ์ค์ ๋ค๋ฅธ ์์ ์ ์ํ
- ๋ฐ์ดํฐ ๋นํธ๋ฅผ ๋์คํฌ์ ์ ์ฅ
- ์ค๋์ค ์ฌ์
์ถ์ฒ : Raywenderich - ์ฌ๊ธฐ ํด๋ฆญ
ํ ๋ฒ ์๊ฐ์ ํด๋ณด๋ฉด ๊ฐ๊ฐ์ ์์ ๋ค์ ์๋ก์ ์คํ์ ์ฐจ๋จํ์ง ์์ต๋๋ค.
์๋ก ๋ค๋ฅธ ์ค๋ ๋์์ ์๋ก ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋๋ก iOS๋ ๋ค์ํ ์ข ๋ฅ์ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
Apple์ Cocoa and UIKit asynchronous APIs (๋น๋๊ธฐ API)
ํ ๋ฒ์ฏค ์ฌ์ฉํด๋ดค๊ฑฐ๋ ๋ค์ด๋ณธ ๋ด์ฉ์ผ ๊ฒ์
๋๋ค.
Apple์ iOS SDK์์ ๋น๋๊ธฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
- NotificationCenter
- Delegate Pattern
- Grand Central Dispatch(GCD)
- Closures
- Combine - iOS13๋ถํฐ ์ด์ฉ๊ฐ๋ฅํ API
๋๋ถ๋ถ์ ํด๋์ค๋ค์ ๊ฐ๋ฐ์์ ์๋์ ๋ค๋ฅด๊ฒ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๊ณ ,
UI ์์์ ๊ฒฝ์ฐ๋ ๋ณธ์ง์ ์ผ๋ก ๋น๋๊ธฐ์ ์
๋๋ค.
๊ฐ๋ฐ์๊ฐ ์ฑ ์ฝ๋๋ฅผ ์์ฑํ์ ๋, ๋งค๋ฒ ์ด๋ค ์์๋ก ์๋ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ฉ์์์ ์ธํฐ๋์
, ๋คํธ์ํน, ์ด๋ฒคํธ ๋ฑ์ ์ธ๋ถ ์์ธ์ ์ํด ์์ ํ ๋ค๋ฅธ ์์๋ก ์คํ๋ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค ๋ณด๋ฉด ๊ฐ๊ฒ ๋๋ ๋ฌธ์ ์์
๐ฃ ํด๋์ค์ ํจ์์ ์๋ ์์๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค!
์ด๋ค ๊ฒ์ด ๋จผ์ ๋ฆฌํด๋ ์ง, ์๋ ์์๋ฅผ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋์ค๊ฐ ๋ณต์กํด์ง๋ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋๋ค.
์ฝ๋ ์์)
IBAction func onLoad() {
editView.text = ""
self.setVisibleWithAnimation(self.activityIndicator, true)
downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
}
}
๐ฃ ์ฒ๋ฆฌํด์ผ ํ ์์
์ด ๋ง์์ง ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค.
Swift ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด Escaping Closure ๋ฐ Completion Handler๋ฅผ ์ฌ์ฉํ๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ง์ด ํ๊ฒ ๋ฉ๋๋ค.
๋ง์ ๋น๋๊ธฐ ์์
, ์ค๋ฅ ์ฒ๋ฆฌ, ๋น๋๊ธฐ ํธ์ถ ๊ฐ์ ์ ์ด ํ๋ฆ์ด ๋ณต์กํ ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Apple์์ ์ ๊ณตํ๋ API(ex. GCD)๋ฅผ ์ฌ์ฉํด์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์๋ ์ฌ๋ฌ ๋ฌธ์ ์ ์ ๋๋ผ๊ฒ ๋์ฃ .
DispatchQueue๋ ํด๋ก์ ๋ง์ผ๋ก๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅ์ ํ์ง๋ง ์ฒ๋ฆฌํด์ผํ ์์
์ด ๋ง์์ง ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋งค์ฐ ๋ณต์กํด์ง๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
๐ฃ ๋น๋๊ธฐ ์์
์ ๊ฒฝ์ฐ ์ฆ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋๋ค.
๋์ค์ ๋ฐ์ดํฐ๊ฐ ์ค๋ฉด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๊ณ ์ถ์ต๋๋ค. Completion Handler ๋ง๊ณ Return ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์๊ฑฐ์ฃ .
๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด Rx์ Observable์
๋๋ค. (์ฐ๋ฆฌ๋ RxSwift์์์ Observable ์ด๊ฒ ์ฃ ?)
๋์ค์ ๋ค์ ์์๋ณด๊ฒ ์ง๋ง ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋น๋๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ์ํ 4๊ฐ์ง
๋ชจ๋ ๋น๋๊ธฐ์์ ์ ์ฒ๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ์ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋จธ์ง ํญ๋ชฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ์ฝ์ด๋ณด์ธ์.
์ฐ๋ฆฌ๋ ์ด ์ค์์ ์ค๋ ๋ ๊ด๋ฆฌ์ ์ง์คํด๋ด
์๋ค.
- ๋ช ์์ ์คํ(Explicit execution)
- ์๋ก์ด ์ค๋ ๋์์ ์์ ์ ์์ํ๋ฉด ๊ทธ๊ฒ์ ์ปจํธ๋กคํ ์ ์์ด์ผ ํ๋ค.
- ์ฌ์ด ์ค๋ ๋ ๊ด๋ฆฌ(Easy thread management)
-
๐ฃ ๋น๋๊ธฐ์์ ์์ ์ค๋ ๋ ๊ด๋ฆฌ๊ฐ ํต์ฌ์ด๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋์ค์ด๋ ์์ ์ด ๋๋ ํ, (์๋ฅผ ๋ค๋ฉด ๋คํธ์ํน ์ฒ๋ฆฌ ํ) ๋ฉ์ธ์ค๋ ๋์์ UI๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ ๋๊ฐ ์๋ค. ์ด ๋ ์ค๋ ๋(๋ฐฑ๊ทธ๋ผ์ด๋) → ๋ค๋ฅธ ์ค๋ ๋(๋ฉ์ธ)๋ก ์์ ์ ๋๊ฒจ์ผ ํ๋๋ฐ ์ค๋ ๋๋ฅผ ์ฝ๊ฒ ์ ํํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ค๋ ๋๋ก ์์ ์ ๋๊ธธ ์ ์์ด์ผ ํ๋ค.
- ์ฌ์ด ๊ตฌ์ฑ๋ ฅ(Easily composable)
- ๋น๋๊ธฐ์์ ์ ์์ฑํ๊ณ ์์ํ๋ฉด ๊ทธ๊ฒ์ ๋ค๋ฅธ ์ด๋ค ์ค๋ ๋์ ์์กดํ์ง ์๊ณ ์์ ์ด ๋๋ ๋๊น์ง ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ถ์์ฉ ์ต์ํ(Minimum the sid effects)
- ๋ฉํฐ ์ค๋ ๋๊ฐ ์ํ๋๋ ๋์ ์ค๋ ๋ ์๋ก ๊ฐ ์ํฅ์ ๋ผ์น๋ ๋ถ์์ฉ์ ์ต์ํํด์ผํ๋ค.
๋ง๋ฌด๋ฆฌ ์๊ฐ
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์ ํ๊ฒ ๋ ๋ ํ์๋ถ๊ฐ๊ฒฐํ๊ฒ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ฒ ๋ฉ๋๋ค. ๋คํธ์ํฌ ํต์ ๋ง์ ๋ณด๋๋ผ๋ ์ฐ๋ฆฌ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ์ธ์ ๋์ฐฉํ ์ง ๋ชจ๋ฅด๊ณ , ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ฉด ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋์ฃ ? ์ด์ฒ๋ผ ์ฐ๋ฆฌ๋ ์์ ์ ๋ํ ์์๋ฅผ ํญ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ์ด ํ์ํ ๊ฒ์ ๋๋ค.
๋ฌธ์ ์
๋น๋๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋์ ๋ณดํต Closure์ Completion handler๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ ์ด ๋ง์์ง ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋ฆฌํด๊ฐ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ์์ฐ์ค๋ฝ๊ฒ ๋ค๊ฒ ๋๋๋ฐ ์ด ๋ ์ฐ๋ฆฌ๋ RxSwift๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
์์ฝ
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๊ฐ๊ฐ์ ์ค๋ ๋๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์๊ธฐ ์์
์ ์ํํ๋ ๊ฒ์ ์๋ฏธํ๊ณ , ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์
์์๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ์ด๋ค ์ค๋ ๋๊ฐ ๋จผ์ ์์
์ ๋ง์น ์ง ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ ํผ๋ฐ์ค
https://gaki2745.github.io/swift/2019/10/13/Swift-RxSwift-01/
https://zeddios.tistory.com/1230
https://duda-programming.tistory.com/48
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Type 'object' does not conform to protocol 'Decodableโ / โEncodableโ (0) | 2022.08.20 |
---|---|
first(where:)์ first (0) | 2022.08.20 |
Reactive Programming์ด๋? (0) | 2022.08.20 |
UIButton.Configuration์ ํ์ฅํด์ ์ฌ์ฉํด๋ณด์ (0) | 2022.08.15 |
[WWDC19] Introducing Combine (0) | 2022.08.10 |