-
MVC, MVVMProgramming 2020. 6. 26. 22:21
MVC(Model View Controller)
controller 가 입력과 출력을 모두 컨트롤. 컨트롤러에게 많은 역할이 주어졌었음.
-
View(UIView) : 화면에 보여줄 부분 담당
-
controller(UIViewController) : 사용자 Input, 처리로직, 화면에 뿌리는것도 컨트롤러가 담당
-
Model : 데이터 담당
// list에서 데이터를 삭제 하는 작업을 할때 //1. 뷰 데이터에서 해당 데이터 삭제 self.productList.remove(at: indexPath.section) // 2. UI update self.productListTableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)
MVVM(Model View ViewModel)
View (다) - ViewModel (1) : 여러화면이 있더라도, 같은 데이터모델을 가지고 있다면 전부 다 똑같은 모델을 공유 가능
-
View(UIViewController): ViewModel 을 지켜보고 있고(구독), 값이 바뀌면 화면을 업데이트
-
ViewModel(PlainObject): 화면에 그려지는 데이터 요소만 가지고 있음. 모델하고만 서로 주고받음 View 에게 화면을 그리라고 하지 않음
-
Model(PlainObject)
ViewModel
class MenuListViewModel { lazy var menuObservable = BehaviorRelay<[Menu]>(value: []) lazy var itemCount = menuObservable.map { menus in menus.map { $0.count }.reduce(0, +) } //menuObservable 값이 바뀔때마다, 총 액을계산해서 totalPrice 가 변경된다 lazy var totalPrice = menuObservable.map { menus in menus.map { $0.price * $0.count }.reduce(0, +) } .... }
View
ViewModel 의 데이터가 바뀌면, 그 데이터를 테이블 뷰에 반영해서 셀을 다시 그려준다.
초기화시 한번 bind만 해주면, 뷰데이터가 바뀌면 알아서 셀이 바뀌기 때문에 numberOfRowsInSection, cellForRowAt 를 쓰지 않아도 된다.
//MARK:- ViewDidLoad viewModel.menuObservable .bind(to: tableView.rx.items(cellIdentifier: cellId, cellType: MenuItemTableViewCell.self)) { index, menuItem, cell in // cell 을 위한 뷰모델 // let cellViewModel = self.viewModel.cellViewModels[index] // cell.setViewModel(cellViewModel) cell.title.text = menuItem.name cell.price.text = "\(menuItem.price)" cell.count.text = "\(menuItem.count)" // +, - 처리 cell.onChange = { [weak self] increase in self?.viewModel.changeCount(menuItem, increase) } }.disposed(by: disposeBag)
출처. 곰튀김님의 RxSwift 4시간만에 끝내기
https://github.com/iamchiwon/RxSwift_In_4_Hours'Programming' 카테고리의 다른 글
[컨퍼런스] Apple WWDC2020 (0) 2020.06.22 [책] 읽기 좋은 코드가 좋은 코드다 - 1 (0) 2020.06.02 노드js] 2 - 테스트 서버 만들기 (0) 2020.03.02 노드js] 1 - 기본개념 (0) 2020.03.02 -