대규모 뷰 컨트롤러-iOS-솔루션


16

모든 새로운 iOS 개발자에게는 다음과 같은 문제가 있다고 확신합니다. View Controller는 다양한 목적으로 코드가 매우 빠르게 혼잡하여 500 줄 이상의 코드를 쉽게 얻을 수 있습니다.

다음은 두 가지 기본 및 공통 화면의 모습입니다.

1) 양식 화면 : 여기에 이미지 설명을 입력하십시오

2) 테이블 뷰 컨트롤러 화면 여기에 이미지 설명을 입력하십시오

지금까지 두 가지 솔루션에 대해 읽었습니다.

  1. 첫 번째 해결책 : https://bendyworks.com/single-responsibility-principle-ios/ . 이는 알림을 기반으로하며 View Controller를 (의도) View Model과 완전히 분리하여 View Controller의 코드를 줄입니다. Go-To 구조와 비슷한 코드를 깨는 단점이 있다고 생각합니다. 다음과 같이 보입니다 : 여기에 이미지 설명을 입력하십시오

  2. 두 번째 솔루션은 동일한 붐비는 View Controller를 유지합니다 (버튼 작업은 VC 등에서 실행 됨). 그러나 TPKeyboardAvoiding , BlocksKit 또는 대부분의 카테고리에 따라 다른 솔루션 과 같은 라이브러리를 사용합니다 . 이 두 번째 솔루션을 사용하면 코드가 크게 줄어들지 만 뷰 컨트롤러에는 여전히 많은 책임이 있습니다.

이 솔루션에 대해 어떻게 생각하십니까? 어떤게 더 좋아? 더 좋은 것이 있습니까?


5
나는 때문에 시간의 좋은 대답을 줄 수는 없지만, 올바른 방향을 가리켜 야합니다.
Mike D

저의 의도는 많은 새로운 개발자들이 가지고있는이 문제를 마침내 극복하기 위해 가능한 많은 좋은 답변을 모으는 것입니다. 링크에 감사드립니다. 새로운 것을 찾으면 반드시 여기에 게시 할 것입니다.
Ravul

여기에 앤디 Matuschak에 의해 지방 뷰 컨트롤러와 싸우고에 대한 좋은 이야기입니다 https://realm.io/news/andy-matuschak-refactor-mega-controller/
토마스 바크

답변:


6

MVVM을 사용하여이 문제를 해결할 수 있습니다.

Model-View-ViewModel 또는 MVVM 패턴은 일반적으로 UI 디자인 패턴입니다. VM은 VC에서 UI에 대한 모델 데이터 준비에 대한 모든 논리를 사용합니다.

예 :
일부 필드가있는 모델 객체가 있고 일부 필드를 형식화하고 계산하고 결합하려고합니다.

MVC의 경우 ViewController에있는 모든 논리.
MVVM에서는 모든 것을 VC에서 VM으로 옮깁니다.

VM은 UI에 대한 모든 데이터를 준비하고 VC는 이와 같이 설정합니다.

(VC 클래스에서)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

튜토리얼 및 주제 :


3
이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 필수 부분을 포함시키고 참조 링크를 제공하는 것이 좋습니다.
Bart van Ingen Schenau

바트에 동의합니다. 다른 사람이이 모든 방법에 대한 요약을 게시하지 않으면 모든 방법을 이해하고 테스트하는 즉시 작성합니다.
Ravul

2
@Ravul 업데이트 된 답변
kaspartus

귀하의 답변에 찬성을 표명했으며이 아이디어에 감사드립니다. Functional Reactive Programming에 대해 읽고 있는데 좋은 생각입니다. 이 질문에 대한 답은 다음과 같은 네 가지 방법으로 문제에 접근하는 데 대한 몇 가지 장점, 단점 및 최소한 하나의 개념 다이어그램이 포함 된 열거라고 생각합니다. 1) 반응성 코코아 2) KVO 3) 위임 방법 및 4) 고전적인 방법 View Controller 작성 아무도 내 앞에 아무도 그렇게하지 않으면이 방법들을 모두 시험하자마자 작성하겠습니다. 그 동안 새로운 방법을 찾으면 훨씬 좋습니다.
Ravul

3

이전에 대규모 View Controller에서 코드를 풀어야했기 때문에 처음에는 콘텐츠를 탐색 할 수 없었습니다. 내가 깨달았 던 한 가지 중요한 점은 View Controller의 크기만으로는 사물을 분리하기에 충분하지 않다는 것입니다. 하나의 큰 파일을 갖는 복잡성과 작은 파일을 많이 갖는 복잡성이 있습니다. View Controller를 작은 부분으로 나누기 위해 리팩터링해야하는 몇 가지 이유는 다음과 같습니다.

MVC

View Controller는 View와 Model을 연결하는 접착제 이상의 역할을 수행하지 않아야합니다. 많은 네트워크 연결 코드, 이미지 조작 코드 등이 있으면 도우미 클래스로 분류하는 것을 고려하십시오.

View Controller를 데이터 소스로 사용하는 다중 컨트롤

화면에 View Controller가 데이터 소스로 포함 된 많은 컨트롤이있는 경우 별도의 데이터 소스 개체로 분리하여 데이터 소스로 사용하는 것이 좋습니다. 또는 별도의 View Controller로 분리 할 수도 있습니다 (예 : View Controller에 다른 컨트롤러 외에 테이블 뷰가있는 경우 자체 테이블 뷰 컨트롤러 클래스로 분리 할 수 ​​있음).

중복 코드

다른 View Controller에 정확히 동일한 코드가 있으면 1 개의 공유 위치에 넣으십시오. 그러면 코드를 재사용하고 복잡성을 관리하는 데 도움이됩니다.

View Controller 복잡성을 최소화하기위한 몇 가지 추가 조언이 있습니다.

프로그래밍 방식이 아닌 스토리 보드

뷰 요소를 만드는 것은 많은 코드이며 프레임 지오메트리 코드도 많은 작업입니다. 자동 레이아웃 제약 조건을 사용하고 가능한 많은 스토리 요소를 스토리 보드에 배치하는 것을 고려하지 않은 경우.

불필요한 코드 / 설명

또한 불필요한 코드 / 설명을 제거하십시오. 많은 경우 새 View Controller 파일에는 사용하지 않는 메소드가 제공됩니다. 당신이 같은 방법을 사용하지 않는 경우 didReceiveMemoryWarning그것을 제거하는 것이 안전합니다. 또한 View Controller 파일이 너무 커서 때로는 오래된 코드 나 주석을 제거하는 것이 무섭습니다. 그만두 지마! 복잡성을 증가시킵니다.

알림

알림에 대한 귀하의 질문에 답변하려면 : 알림은 모든 것에 사용할 골든 해머가 아닙니다. 하나의 특정 작업으로 인해 여러 View Controller가 동시에 업데이트되어야 할 때 유용한 알림이 있습니다. 그러나 알림을 과도하게 사용하면 알림을 추적하는 데 많은 고통이 발생할 수 있습니다.


2

VIPER (View, Interactor, Presenter, Entity and Routing)이라고하는 특별한 아키텍처가 있습니다. 나는 당신이 알아야 할 것에서 이력서를 시도 할 것입니다 :

전망

  • 그것들은 더미보기입니다.
  • UIView, UIViewController, UILabel 등과 같은 객체를 포함합니다.
  • 발표자 의 컨텐츠를 기다립니다 .
  • 사용자 상호 작용을 처리하고이를 Presenter 레이어로 전달합니다 .

증여자

  • UI 객체를 모른다;
  • 레이어 에서 입력을 얻습니다 .
  • 뷰 로직 처리 (add 메소드가 다른 화면을 표시 함);

라우팅

  • 내비게이션 로직 및 전환 애니메이션 처리
  • UINavigationController, UIWindow 등과 같은 객체를 알고 있습니다.

따라서 코드에서 정리할 내용은 다음과 같습니다.

  • 데이터 유효성 검사는 발표자 계층으로 이동합니다 .

  • 탐색은 와이어 프레임 객체로 이동합니다 ( 라우팅 레이어).

  • DRY 원리를 준수하여 뷰 컨트롤러를 분할하십시오 .

  • 복잡한 화면에는 둘 이상의보기 및 발표자가 있습니다.

VIPER 아키텍처에 대한 다음 링크를 참조하십시오 http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

행운을 빕니다!


1
이 아키텍처는 소규모 응용 프로그램에서 작동합니까? 프로젝트에 도입하기 위해 많은 객체를 만들어야하는 것처럼 보입니다.
Tomasz Bąk

예, 기존 MVC보다 더 객체이지만 가치가 있다는 것에 동의합니다. 올해 github.com/orafaelreis/cascavel에서 만든 간단한 예제를 볼 수 있습니다. Cascavel은 VIPER 프로젝트를 초기화하는 기본 프로젝트와 같습니다.
orafaelreis

훌륭합니다! VIPER 아키텍처는 대규모 뷰 컨트롤러 문제를 피하기 위해 정확하게 설계된 것 같습니다.
Christophe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.