ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MVC, MVVM
    Programming 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

    댓글

Designed by Tistory.