#1 – UITableViewDelegate 및 UITableViewDataSource 프로토콜이 이 ViewController.swift 파일에 지정된 이유는 무엇입니까? 이 UIViewController 하위 클래스 서명을 읽기 가 더 어렵을 뿐만 아니라 이러한 프로토콜에 대한 모든 속성 및/또는 메서드 준수 요구 사항을 이 파일에 구현해야 코드 팽창이 이어집니다. UIViewController 클래스에 더 많은 프로토콜이 필요한 경우 어떻게 해야 합니까? 나는 6 ~ 8 개의 다른 프로토콜을 채택하는 뷰 컨트롤러의 예를 보았다. 아래 MVVM 예제에서 볼 수 있듯이 우아한 솔루션이 있습니다. M for „Model” – 도메인별 정보(데이터)를 가장 간단한 형식으로 저장하는 구조입니다. 원시 상태로 유지하여 휴대가 가능하고 재사용 가능합니다. 예를 들어 전화 번호를 10자리 또는 문자로 저장할 수 있습니다. 원시 „2125514701”을 „(212) 551-4701” 또는 „212-551-4701” 또는 „212.551.4701”과 같은 것으로 변환하기 위해 ViewModel에 둡니다. 그런 다음 뷰/뷰 컨트롤러는 ViewModel에서 얻는 전화 번호 표현을 표시할 수 있습니다. 국제적으로 번호로 전화를 거는 경우 해당 세부 정보를 ViewModel에 그대로 둡니다.
이 자습서에서는 Samsara를 예로 사용하여 MVVM 패턴을 적용합니다. 목표는 MVVM을 사용하여 삼사라의 설정 보기를 리팩터링하는 것입니다. MVVM의 도움으로, 나는 마른 보기 컨트롤러와 여러 보기 모델로 끝납니다. 게임 라이브러리가 이미 구현되었습니다. 해당 라이브러리 참조를 초기화의 ViewModel 개체에 전달하는 것을 기억하십시오. 예를 들어 „게임 크리에이터의” ViewModel은 생성된 게임 오브젝트를 라이브러리에 삽입할 수 있도록 초기화자를 통과한 게임 라이브러리의 인스턴스가 있어야 합니다. „게임 목록의” ViewModel 또한 UITableView에 의해 필요한 라이브러리에서 모든 게임을 가져오기 위해이 참조가 필요 합니다. 뷰는 준비된 데이터만 표시해야 하는 .xib 및 .storyboard 파일과 함께 UIView 또는 UIViewController 개체로 표시됩니다. 예를 들어 View 내부에 NSDateFormatter 코드가 싶지는 않습니다. #5 – 나는 전적으로 UI에서 프리젠 테이션을위한 데이터를 준비하기 위한 일부 개인 속성을 사용합니다. 예를 들어 모델에 하이퍼링크를 문자열로 저장하지만 파일을 다운로드하는 URL로 변환합니다.
테이블 뷰는 작동하는 MVC 패턴의 좋은 예입니다. 모델 레이어는 뷰 레이어(테이블 뷰)가 표시해야 하는 데이터를 데이터 원본(주로 뷰 컨트롤러)에 제공합니다. 그러나 테이블 뷰는 MVC 패턴이 어떻게 부족할 수 있는지도 보여 줍니다. 문제를 자세히 살펴보기 전에 MVC 패턴을 간단히 살펴보겠습니다. 이게 뭐예요? 그리고 무엇이 그렇게 인기를 끌게 하는가? 이 예제에서 마지막으로 개선할 수 있는 한 가지 방법이 있습니다. PetViewModel: #6 클래스 닫기 바로 후 다음 확장을 추가합니다. 이는 우려의 분리를 위반합니다. 아래 MVVM 예제에서 볼 수 있듯이 우아한 솔루션이 있습니다. 뷰 및 모델 레이어는 하나 이상의 컨트롤러에 의해 함께 접착됩니다. iOS 응용 프로그램에서, 예를 들어, 그 접착제는 뷰 컨트롤러, UIViewController 클래스의 인스턴스 또는 그 하위 클래스이다.
사람들이 MVC와 MVVM의 차이점을 이해하도록 하는 것은 어려울 수 있으므로 이 자습서에서 너무 많은 고급 항목으로 바다를 진흙투성이로 만들고 싶지 않았습니다. 예를 들어 사용자가 UITextField를 편집하여 뷰 컨트롤러에 의해 캡처할 수 있고 뷰 컨트롤러가 ViewModel에서 속성을 설정할 수 있으며 속성 관찰자가 모델을 업데이트할 수 있는 방법을 보여 줄 수 있었습니다. 하지만 난 하지 않았다. 반대로 ViewModel에서 모델을 모니터링하여 변경 사항을 모니터링한 다음 뷰를 업데이트하는 뷰 컨트롤러를 업데이트하는 방법을 보여 줄 수 있었습니다… 하지만 난 하지 않았다. 마지막으로, 내가 뷰 컨트롤러에 배치 할 수 있었던 KVO에 대한 매우 성가신 Swift 코드로 간주되는 것을 보여 줄 수 있었습니다… 하지만 난 하지 않았다.