2017-11-05 1 views
0

저는 Swift와 함께 MVVM으로 지금 조금씩 작업하고 있습니다. 원리는 매우 간단하다 :MVVM & iOS - 누락 된 규칙

  1. 의 ViewController보기 책임이있다;
  2. ViewModel에 대한 책임은 모델입니다.
  3. ViewController보기입니다.
  4. 의 ViewController뷰 모델을 소유;
  5. ViewModel;

기간.

그건 분명합니다. 그러나 거기에 나는 아직도 그것에 대해 가지고 몇 가지 질문입니다 (그들이 바보 같은 소리를 할 수는 있지만, 위의 규칙으로 초보자뿐만 명확하게하는 것이 중요) :

  1. 해야 뷰 모델은 비즈니스 로직에 대한 책임? ViewController는 모델을 소유하지 않기 때문에 ViewModel에 biz 로직을 배치하는 것이 옳다고 생각합니다.
  2. ViewModel은 struct이어야합니까? 이것은 까다로운 것입니다. 나는 ViewModel이 ViewController에 대한 데이터와 상호 작용하는 API를 제공해야한다고 생각합니다. 따라서 비동기 데이터 (예 : HTTP 호출)를 가져 오기 위해 일부 escaping closures을 사용해야하는 경우가 있습니다. 구조체는 그것을 가질 수 없습니다.
  3. ViewController에서 비 아웃렛 변수를 숨겨야합니까? 때때로보기를 표시하기 위해 일부 속성에 대한 강력한 참조가 필요합니다 (예 : UIPageControl의 현재 페이지 유지). ViewController는이 참조를 유지해야합니까?
  4. ViewModel에서 ViewController 업데이트를 실행하려면 어떻게해야합니까? 나는 reactive programming에 대해 읽었지만 나의 질문은 더 넓다 : 가끔 ViewModel은 어떤 행동에 응답하기 위해 ViewController를 필요로 하는가? ViewController가 처리 할 수있는 특정 반응에 ViewModel이 특정 콜백을 유지해야합니까? 나는 "바인딩"속성에 대해 Srdan Rasic's post을 보았고 혼란 스러웠습니다 (아마도이 ​​질문과 관련이 없습니다).

여러분이 솔루션을 공유 할 수 있다면 기쁩니다. 감사!

답변

1

귀하의 질문은 매우 광범위합니다. 누군가는 분명히 그것을 나보다 넓게 설명 할 것이고, 다른 견해를 가질 수도 있습니다. 그러나 이것들은 나의 관측이다 :

1. 예 뷰 모델은 비즈니스 로직

2 당신이 그것을 스스로 대답 추측을 처리하는 유일한 구성 요소해야한다, 그것은 class해야한다. 나는 왜 그것이 struct이어야하는지에 대한 이유가 없습니다. 그러나 그것이 당신의 필요에 맞는다면 나는 말할 것입니다.

사용에 따라 다릅니다. 보기 목적으로 사용하는 경우 여기에서 가져올 수 있습니다. 불행하게도, 작은 부분을 위해 별도의 ViewModel을 갖는 개념이 존재한다. 이름을 모른다. 전체보기의 기본 ViewModel과 하위보기의 subViewModel이 있다는 뜻입니다. 따라서 ViewModel에 많은 코드가 포함되는 것을 방지 할 수 있습니다. 또한 때로는 받아 들일 수있는 기술적 인 빚 (희망을 말하지 않기 위해 나를 죽이기를 바란다)

4. 그것은 이렇게 간다. 버튼을 누르면 에있는 buttonPressed이라는 메서드를 호출하거나 이벤트를 트리거합니다. 그런 다음 ViewModel이 작업을 수행하며 새 데이터를 얻고 해당 데이터에 대한보기를 설정합니다. 내가 본 것에서는 ViewModel에서 View에 대한 약한 참조를 사용하거나 뷰의 반응성 속성을 바인딩하는 것으로 보았을 것입니다. 두번째 옵션은 ViewModelView을 가질 필요없이 당신을 떠날 것이지만, ViewModel의 모든보기 설정 속성에 대한 옵저버를 등록해야합니다.

+0

답장을 보내 주셔서 감사합니다. @ 루조. 나는 4 번 문제에 대한 해결책을 매우 영리하게 좋아했습니다! 그러나 진실에 대한 나의 탐구에서 주제 2에 대한 토론을 발견했습니다. 실제로 MVVM 패턴에 대한 더 광범위한 논의가 있었기 때문에이 StackOverflow 질문을 작성하게되었습니다. http://matteomanferdini.com/mvvm-pattern-ios-swift /). MVVM 정의 및 우수 사례에 동의하는 사람은 없습니다. 아마도 공식적인 출처로부터 구체적인 답변이 없기 때문일 것입니다. –

+0

나는 그것을 사용하지 않는 것으로 여기에 묘사 된 것에 익숙했다 (적어도 나는 짐작한다). 뷰 모델을 단순한 객체로 만듭니다. 그들은 DataViewController를 뷰 모델이 아닌 변경을위한 드라이버로 사용합니다. 어쨌든, 내 접근 방식에서, 당신은 완전히 어떤 도주를 피할 수 있습니다. 신호를 반환하기 위해 간단하게 바인딩 할 수 있습니다. – Luzo