개발하는 동글 :]

[TIL],[UIKit],[TRY],[MVVM 적용해보기] 본문

카테고리 없음

[TIL],[UIKit],[TRY],[MVVM 적용해보기]

동글하다 2023. 9. 16. 00:45

1. MVVM 양식에 맞게 코드를 적어보자!

아직은 아키텍처 패턴은 잘 모르겠지만 MVVM에 맞게 한 번 코드를 짜보자!

그럼 MVVM은 뭘까?

MVVM 패턴을 사용하는 경우 앱은 다음 계층으로 나뉩니다.

  • 모델 계층은 비즈니스 데이터를 나타내는 형식을 정의합니다. 여기에는 코어 앱 도메인을 모델링하는 데 필요한 모든 항목이 포함되며, 종종 코어 앱 논리가 포함됩니다. 이 계층은 뷰 및 뷰 모델 계층과는 완전히 별개이며, 클라우드에 부분적으로 상주하는 경우가 많습니다.
  •  계층은 UI를 정의합니다. 태그에는 특정 UI 구성 요소와 다양한 뷰 모델 및 모델 멤버 간의 연결을 정의하는 데이터 바인딩이 포함되어 있습니다. 경우에 따라 코드 숨김 파일은 UI를 사용자 지정하거나 조작하는 데 필요한 추가 코드를 포함하거나, 작업을 수행하는 뷰 모델 메서드를 호출하기 전에 이벤트 처리기 인수에서 데이터를 추출하는 데 사용됩니다.
  • 뷰 모델 계층은 뷰의 데이터 바인딩 대상을 제공합니다. 대부분의 경우 뷰 모델은 모델을 직접 노출하거나 특정 모델 멤버를 래핑하는 멤버를 제공합니다. 또한 뷰 모델은 항목 목록의 표시 순서와 같이 UI와는 관련이 있지만 모델과는 관련이 없는 데이터를 추적하는 멤버를 정의할 수 있습니다. 또한 뷰 모델은 데이터베이스 액세스 코드와 같이 다른 서비스와의 통합 지점 역할을 합니다. 간단한 프로젝트의 경우 별도의 모델 계층이 필요하지 않을 수 있으며 필요한 모든 데이터를 캡슐화하는 뷰 모델만 있으면 됩니다.

2. ViewModel을 만들어 보자!

final class TodoListViewModel{
    
    var viewUpdate : () -> Void = {}
    
    private var coreDataManager = CoreDataManager.shared

    func getToDoList() -> [Task]{
        print(#function)
        return coreDataManager.getToDoListFromCoreData()
    }
    
    func updateToDoCompletedToggle(task: Task){
        print(#function)
        coreDataManager.updateCompleted(task: task) {
            self.viewUpdate()
        }
    }
    
    func addToDo(title: String){
        print(#function)
        coreDataManager.saveToDoData(title: title) {
            self.viewUpdate()
        }
    }

    func deleteToDo(task:Task){
        print(#function)
        coreDataManager.deleteToDo(task: task) {
            self.viewUpdate()
        }
    }
    
    func updateToDoTitle(task:Task, title:String){
        print(#function)
        coreDataManager.updateToDo(task: task, title: title) {
            self.viewUpdate()
        }
    }
}

viewModel에서 coredataManager를 가지고 view에 데이터를 주거나 받을 메서드를 구현해 줬다!

3.  ViewContorller

final class ToDoListViewController: UIViewController {
}
extension ToDoListViewController{
    // MARK: - 라이프 사이클
    override func viewDidLoad() {
        super.viewDidLoad()
        setUp()
    }
}

private extension ToDoListViewController{
    func setUp(){
        view.backgroundColor = .systemBackground
        setUpTableView()
        setUpAddButton()
        viewModel.viewUpdate = { [weak self] in
            guard let self = self else { return }
            self.myTableview.reloadData()
        }
    }
}

viewcontroller에서 viewModel의 viewUpdate closure를 수정해 주자! 이렇게 코드를 수정하게 된다면 viewcontroller에서 viewmodel의 메서드를 사용할 때 자동으로 view가 업데이트를 하는 로직을 구현할 수 있었다!

4. TIL

4.1 이번 주의 회고

1. 이번 주는 과제를 하느라 정신없이 흘러간 것 같다. 좀 더 깊은 내용을 공부할 수 있도록 하는 습관을 가지는 게 좋을 것 같다..

2. protocol과 enum을 조금 더 사용해보는게 좋을 것 같다.

3. 알고리즘을 꾸준히 푸는 것에 소흘해 졌다..

4.2 다음 주의 목표

1. 아키텍쳐 패턴을 조금 더 이해하고 적용하는 코드를 사용해 보자.

2. 알고리즘을 꾸준히 풀자

3. protocol과 enum 그리고 제네릭 까지 조금 더 깊게 공부하고 사용해 보는 것을 연습해 보자