MVVM ์ค๋ช ์ ๊ฑฐ๋์ ๋ฏธํ๊ณ ์ผ๋จ ์ ์ฉ๋ถํฐ ํด๋ณธ๋ค ...
* ์ฐธ๊ณ ๋ก RxSwift ์ ์ฐ๋ ๊ฑฐ*
* ๊ณต๋ถ ์ค์ด๋ผ ํ๋ฆด ์ ์์*
๊ฐ์ธ์ ์ผ๋ก ๋์ ๋๋ ์ ์, MVC์์ MV๋ ๊ทธ๋๋ก๊ณ ViewModel๋ง ์ถ๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. (๋น์ฐํจ)
ViewModel ํ์ผ์์๋ ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ๋ณ๊ฒฝ์ด ๊ฐ์ง๋จ์ ๋ฐ๋ผ ๋ทฐ๊ฐ ๋ณ๊ฒฝ๋๋ค๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ ํ๋ฉด์์ ๋๋ค๋ฅผ ํด๋ฆญํ๋ฉด, ๋๋ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ํ์ ์ฐฝ์ด ๋จ๊ณ , ๋๋ค ์ ํ ์ ํ์ ์ฐฝ์ด ์ฌ๋ผ์ง๋ฉฐ ์๋จ๋ฐ์ ๋๋ค์ด๋ฆ์ด ๋ฐ๋๋ค.
์ฌ์ค ์ ๋ฐ ๊ฐ๋จํ ๊ธฐ๋ฅ์ ๋ทฐ๋ชจ๋ธ์ ์ ์ฉํ๋ ๊ฒ์ด ์คํ๋ ค ๋ ๋ณต์กํด์ ธ์ ๊ถ์ ํ๊ณ ์ถ์ง๋ ์์ง๋ง,
๊ณต๋ถํ๋ ๊ณผ์ ์ด๋ ์ผ๋จ ํด๋ณธ๋ค.
ํ๋ฉด์๋ ์์ ์ด ์๋ค...
1. Observable ํ์ผ ์ถ๊ฐ
final class Observable<T> {
typealias Listener = (T) -> Void
var listener: Listener?
var value: T {
didSet {
listener?(value)
}
}
init(_ value: T) {
self.value = value
}
func bind(listener: Listener?) {
self.listener = listener
listener?(value)
}
}
2. View ํ์ผ ์์์
var viewModel = ViewModel()
๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ ํ,
viewDidLoad ํจ์์์ bind()ํจ์๋ฅผ ํธ์ถํด์ค๋ค.
override func viewDidLoad() {
super.viewDidLoad()
if let viewModel = self.viewModel {
bind()
}
}
bindํจ์๊ฐ ์์ด์ ์๋ฌ ๋ ๊ฒ์ด๋ค.
์๋์ชฝ์ bindํจ์๋ฅผ ์ง์ค๋ค.
private func bind() {
self.viewModel.myLocation.bind { myLocation in
print("location changed!", myLocation)
}
}
์ฝ๋ ํด์์ ํด๋ณด์๋ฉด, ๋ทฐ๋ชจ๋ธ์์ Observable(๊ด์ฐฐ) ๊ฐ๋ฅํ myLocation์ด๋ผ๋ ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ๋ ๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
์๋๋๋ก ๋๋ ๋ณด์.
3. ViewModel
class MainViewModel {
var myLocation: Observable<String?> = Observable(nil)
init() {
}
// ๋๋ค ํด๋ฆญ ์ด๋ฒคํธ
func locationDidTap(_ location: String) {
myLocation.value = location
}
}
ViewModel์ ์ฝ๋๋ ์์ ๊ฐ๋ค.
๋๋ค ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ ๋๋ง๋ค locationDidTap์ด๋ผ๋ ํจ์๊ฐ ํธ์ถ๋๊ณ ,
๊ทธ๋์ myLocation์ ๊ฐ์ ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ์์์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
(์ ๊ฒฝ์ฐ๋ ๋๋ฌด ๊ฐ๋จํด์ ์คํ๋ ค ์๋ ๊ฒ ๋์ ์ ๋ ... ๊ทธ๋๋ ํด๋ณด์)
[View์ TableView Delegate ๋ถ๋ถ]
"์์ฌ๋", "์๊ต๋", "๋์๋" ์ด๋ผ๊ณ ์จ์ ธ์๋ ์ ํ ์ด๋ธ๋ทฐ๋ฅผ ํด๋ฆญ ์ ํธ์ถ๋๋ ํจ์์ด๋ค.
ViewModel ์ locationDidTap์ ํธ์ถํด์ค๋ค.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let idx = indexPath.item
self.viewModel.locationDidTap(locationData[idx])
tableView.deselectRow(at: indexPath, animated: true)
}
4. ๋ก๊ทธ ์ถ๋ ฅ
๊ตฟ ~~
ViewModel์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ View์์ ์์์ฑ๋ค๋ ๊ฒ์ด ์ฆ๋ช ๋์๋ค.
์ด์ RxSwift๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ๋ค๋ฌ์ด๋ณด์.
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Share Extension (0) | 2022.10.03 |
---|---|
์ฑ์ ๋ผ์ดํธ๋ชจ๋๋ง ์ง์ํ๊ฒ ๋ง๋ ๋ค. (0) | 2022.10.03 |
ํค๋ณด๋ ๋๋ฌธ์ ํ๋ฉด ๊ฐ๋ ค์ง ๋ (0) | 2022.10.03 |
์ค๋ต๋ฐ ๋ง๋ค๊ธฐ (์ ๋๋ฉ์ด์ ์ผ๋ก ์์น ์ด๋) (0) | 2022.09.23 |
[RxSwift] bind, drive (0) | 2022.09.07 |