2010-02-08 5 views
15

나는 다른 사람을 물어 후 그 중 하나는 내가 "적어도 조금 구체적인 대답을"이라고 부르는 제공하지 않고, 잠시 동안 궁금되었습니다MVC에서 모델 클래스에 대한 참조는 어디에 두겠습니까?

질문 :

경우,의 iPhone 응용 프로그램은 모델 클래스에 대한 참조를 유지해야합니다 (MVC 접근 방식 사용).

아이폰 (코코아)에서

응용 프로그램은 우리가 기본적으로 우리의 응용 프로그램의를 시작하고 우리의 컨트롤러 inits, 또한 UITouch 이벤트를 처리하는 '앱 위임 "을 부르는 있습니다.

그래서 앱 위임은 컨트롤러? 모델 클래스? 둘 중 누구도? 나는 그것이 모델 참조를 어디에 두어야하는지 혼란스럽게한다는 것을 알지 못한다고 생각합니다.

응용 프로그램 위임을 가지고가, 그 대리인이 응용 프로그램의 뷰 컨트롤러에 대한 참조를 포함 : 예

. 내 응용 프로그램에서 모델 클래스 A (웹 서버 데몬 클래스)와 해당 웹 서버에서 쿼리 한 데이터를 저장하는 클래스 B를 사용하는 경우

어디 너희들은 A와 B에 대한 참조를 저장하는 것? (App Delegate View Controller? View Controller? Both?)

여기에 많은 옵션이 있지만 예를 들어 mvc를 사용하여 하나의보기 만 사용하는이 응용 프로그램을 함께 사용하는 방법을 알고 싶습니다.

답변

7

AppDelegate에 모든 것을 넣어 유혹, 그러나 당신이이 일을 시작하는 경우, 다음 AppDelegate에이 기준 해킹의 전체 될 것입니다. 당신이 엄격한 MVC를 수행하는 경우에, 당신은 3 가지가 있어야합니다 (뷰와 모델 사이의 조정을 위해)

  • A 모델
  • 전망 컨트롤러 (만보기 로직)
  • 컨트롤러를

그래서 예를 들어, 나는 모델 푸와 푸 컨트롤러를 가지고있다. 내가 가진 것 :

  • Foo.m (모델)
  • FooViewController.m (표시하는 푸)
  • FooController.m은 (로직 컨트롤) 마지막으로

그리고, 응답하도록 질문, 나는 foo 컨트롤러에 foo에 대한 내 참조를 저장합니다. 저는 컨트롤러에 싱글 톤을 사용하는 것을 좋아하지만, 저만 그렇습니다. 당신의 푸의

+1

인터페이스 빌더를 통해 GUI 용 .xib 파일로 작업하는 경우 "FooViewController.m (Foo 표시)"(보기 논리 만 포함)는 다음과 같습니다. FooViewController.xib ?? – Goles

+0

본질적으로 그렇습니다. xib를 사용하는 경우에도 백업 .m 파일이 있으며 해당 파일은보기 컨트롤러입니다. – coneybeare

1

전통적으로 컨트롤러가 모델 만든 다음 그 모델과 뷰를 초기화한다 얻을 [[FooController sharedInstance] listOfFoos] : 당신이 싱글 톤을 사용한다면, 당신은 같은 것을 할 수 있습니다. 그런 다음 컨트롤러는 모델의 변경 사항을 수신하고이를 통해 프로그램의 흐름을 조정하고 조정합니다. 그것은 제 일반적인 대답 일 것입니다. 실제 상황은 iPhone 개발과 다를 수 있습니다.

1

iPhone 응용 프로그램에서 응용 프로그램이 모델 클래스에 대한 참조를 유지해야합니까 (MVC 방식 사용)?

컨트롤러 레이어 모델의 계층에 대한 참조를 유지한다.

그래서 앱 위임은 컨트롤러? 모델 클래스? 둘 중 누구도?

앱 위임

는 컨트롤러이다.

어디 사람이 A와 B에 대한 참조를 저장하는 것?

A 및 B는 일반적으로 컨트롤러 레이어가 만들고 소유하는 모델 클래스입니다. 난 정말 너희들이 함께 하나 개의보기를 사용하는이 응용 프로그램을 넣어 MVC을 사용하는 방법을 알고 싶습니다

.

컨트롤러 레이어의 목적은 모델 및 뷰 레이어가 자체 포함되도록 허용하는 것입니다. 모델은 컨트롤러 또는 뷰 레이어에 대해 아무것도 모르는 상태 여야합니다. 뷰는 컨트롤러 또는 모델 레이어에 대해 전혀 알 필요가 없습니다. 컨트롤러의 작업은 한쪽면에는 모델의 양면 어댑터가 있고 다른 쪽면에는 뷰가 있어야합니다.

나는 다음과 같이 귀하의 예제 응용 프로그램을 설정합니다 :

  • UIApplication 대표를 AppDelegate에에.
  • 서버 클래스 (A)의 작업은 간단 경우
    • AppDelegate에 만들고 서버 클래스 A의 예 (들)을 소유
  • 설치 서버 클래스의 동작 (A) 복잡 :
    • 서버를 제어하는 ​​전용 컨트롤러 클래스 (C)를 만든다.
    • AppDelegate는 클래스 C의 인스턴스를 만들고 소유합니다. (A)의 각 인스턴스에 대해 (C)의 인스턴스 하나. 클래스 C의
    • 각 인스턴스는 생성하고보기를 소유 부하 및 클래스 A.
  • AppDelegate에 생성하고 당신의 ViewController 클래스의 인스턴스를 소유 한 인스턴스를 소유하고있다.

그것은 클래스 B의 목적이 무엇인지 질문에서 명확하지 않다. 그것은 단지 (구성 데이터 또는 정적 웹 사이트 데이터 같이)의 사용에 대한 데이터의 덩어리가 있다면

  • , 나는 그것이 서버 (A)에 의해 생성하고 소유 할 수있을 것입니다.이 서버 작동 중에 생성되어보기에 표시해야 할 데이터가 있다면
  • 이, 그때는 아마 같은 것을 원할 것입니다 : (A)에 의해 소유
    • 변경 가능한 배열을
    • B의 인스턴스를 개최합니다 해당 배열을 참조하고 뷰에 대한 데이터 소스/위임자 역할을하는 다른 컨트롤러 클래스 (D). 즉 더 나은 개념적으로 일을 설명하는 데 도움이 경우 내 응용 프로그램에서
3

나는 보통의 AppController에 AppDelegate에 클래스 이름을 바꿉니다. 앱 컨트롤러는 모델 객체 컬렉션을 관리하는 모델 컨트롤러 및 창 또는보기 컨트롤러를 만들고 구성하거나 필요에 따라 참조를 설정하고 NSApplication 대리자 메소드에 대한 응답으로 해당 컨트롤러에서 메서드를 호출하거나 높은 수준의 액션 메소드를 메인 메뉴에서 선택할 수 있습니다. 애플리케이션의 복잡성에 따라 앱 컨트롤러 외부에서 생성되는 추가 모델 또는보기 컨트롤러가있을 수도 있습니다.

물론 간단한 응용 프로그램을 사용하는 경우 원하는 경우 응용 프로그램 컨트롤러가 모델 컨트롤러의 역할을 수행하지 않아도됩니다. 당신이 피하고 싶은 것은 수백 줄의 코드를 파일로 저장하는 것이며, 모두 개념적으로 관련이없는 작업을 수행합니다.

0

대부분의 경우 AppDelegate는 기본 기능 (예 : 모든 컨트롤러에 적용 할 배경 이미지)을 배치 할 수있는 좋은 장소를 제공하지만 추가 컨트롤러와 모델 코드를 다른 곳에서 갖고 싶어합니다. navController 또는 rootController는 종종 AppDelegate의 속성으로 배치됩니다.

그래서 나는 "어느 쪽이든"과 "컨트롤러"사이에 있지만, 어느쪽으로도 기울지 않는다고 말하고 싶습니다. 확실히 "모델"하지 마라!

관련 문제