2012-01-18 2 views
4

저는 Mac 프로그래밍을 처음 접했고 문서 기반 응용 프로그램을 만들고 있습니다.문서 기반 코코아 응용 프로그램에서 커플 링 방지?

NSDocument 하위 클래스는 NSWindowController 하위 클래스를 만듭니다. 이 윈도우 컨트롤러는 하위 서브 클래스도 두 개 만들었습니다 (NSViewController).

간혹 NSViewController의보기 중 하나가 변경되면 NSDocument 및/또는 기본 모델 클래스를 알릴 필요가 있습니다. 또한 모델 변경은 모든보기/일부보기에 통보해야합니다.

제 질문은 : 커플 링이 없도록 (또는 최소) 커플 링이 가장 좋은 방법은 무엇입니까? 나는 몇 가지 선택이 있습니다 알고 있지만, 내가하지 프로그래밍 있지만 코코아에 특히 NSDocument 초보자이야 나는 하나가 내 응용 프로그램에 가장 적합한 확실하지 않다 :

  • KVO. 구현하기 쉽고 멋지게 보이지만 관찰자에게 변경 사실을 알리지 않고 (AFAIK, self.someProperty = newValue은 자동으로 관찰자에게 알립니다), 등록해야한다는 사실을 좋아하지 않습니다. 시간이 지나면 바뀔 수있는 속성 이름.

  • 알림. 나는 그들이 무엇인지 알고 있으며, iOS 용으로 사용해 왔습니다. 그러나 나는 그들이 관찰자에게 즉시 보내지는 않을 것이라는 점을 어딘가에서 읽었습니다. 사실입니까? 그렇지 않다면 문서 기반 앱에 대한 좋은 접근 방식으로 보입니까?

  • 대리인. 예, 일반적인 조건 (또는 일반적으로 보았던 것)에서 클래스에는 하나의 대리자가 있습니다. 그러나 대리자 배열을 만드는 것은 잘 작동합니다 (방금 테스트했습니다). 여기서 볼 수있는 문제는 대리자에게 루프를 통해 전달해야 할 때마다 메서드에 응답하는지 확인하고 해당 메서드를 호출해야한다는 것입니다.

다른 대안이 있습니까?

+0

알림 *은 즉시 옵서버에게 전송됩니다. –

답변

1

컨트롤러 클래스에 의한 KVO는 모델과 해당 뷰 (들) 간의 연결을 수행하는 가장 일반적인 방법입니다. 사실 컨트롤러 레이어에서 코드를 대부분 없애려는 Cocoa Bindings는 KVO를 기반으로합니다. KVO/KVC가 속성 이름을 사용한다는 것은 사실이며, 이러한 변경이있을 경우보기를 연결하는 바인딩 또는 KVO 설정을 변경해야합니다. 그러나 기본 모델의 특성을 전혀 모르는 상태로 만드는 것이 일반적으로 불가능하므로 문제로 보지 않습니다.

제 생각에는 코코아 바인딩을 사용하는 것이 좋습니다. 접착제 코드가 많이 없기 때문입니다. 컨트롤러를 사용할 수없는 곳에서는 컨트롤러 (MVC의 중간 레이어)가 KVO를 사용하여 모델 변경 사항을 관찰하고 적절한 뷰를 업데이트해야합니다. 뷰의 변경 사항은 컨트롤러에 의해 속성 접근 자 및/또는 KVC를 통해 모델로 다시 전달 될 수 있습니다.

+1

나는 모델을 완전히 알지 못한다는 것에 동의하지 않는다. 이것이 사실이라면,'NSTableView'는 사실상 모든 코코아 개발자들에게 작동하지 않을 수 있습니다. 사용 가능한 패턴 (바인딩, 위임자, 데이터 소스)을 사용하면 뷰를 완전히 독립적으로 만들 수 있으며 사실이 것이 목표입니다. –

+0

네, 맞습니다. 뷰는 모델을 인식하지 못할 수 있지만 컨트롤러 레이어는 모델과 뷰의 세부 정보를 알고 있어야합니다. OP는 컨트롤러 레이어 (NSViewController 및 NSWindowControllers)에 대해 정말로 묻습니다. NSTableView 자체는 모델을 인식하지 못하지만 컨트롤러를 모델에 연결하는 데 가장 많이 사용되는 컨트롤러는 모델의 특성을 알아야하기 때문에 컨트롤러 클래스에 하드 코딩 된 키 경로가 있어야합니다. –

+0

@AndrewMadsen 감사합니다. 단지 KVO로 전환하고 명확하게 _willChangeValueForKey_ 및 _didChangeValueForKey_를 호출해야하는 경우를 제외하고는 더 깔끔한 코드로 변경했습니다. 왜냐하면 관찰자가 이러한 메서드를 호출하지 않으면 변경 사항을 알지 못했기 때문입니다. 다시 말하지만, KVO를 처음 접했을 때 클래스가 KVC 호환이어야한다는 것을 알고 있지만,이 클래스는 관찰자에게 알리고 알리지 않습니다. 아직 어떤 지식이 필요하다고 생각합니다. ... – msoler

1

예 (정상적으로 보았을 때), 클래스에는 명의 대의원이 있습니다. 그러나 대리자 배열을 만드는 것은 잘 작동합니다 (단지 테스트 됨).

위임자는 위임하는 개체의 동작을 수정하는 데 자주 사용됩니다. 애플리케이션 위임은 좋은 예입니다. NSApplication 자체만으로는별로 흥미롭지 않습니다. 그것은 대리인에게 응용 프로그램의 흥미로운 동작을 정의하는 것에 의존합니다.다양한 대리자가 서로 충돌하면 단일 개체의 동작을 수정하려는 모든 대리자가 문제가 될 수 있습니다. 대의원들이 동의하지 않으면 어떻게합니까?

클래스가 하나 이상의 델리게이트를 사용하지만 각각 다른 역할을하는 코코아의 경우가 있습니다. 예를 들어, NSTableView는 델리게이트와 데이터 소스를 모두 가지고 있지만, 둘 다 실제로는 델리게이트입니다.

내가 여기에서 볼 문제는 내가 그들을 통해 루프 가지고있는 대표에게 통지해야 할 때마다, 반드시 그들이 방법에 응답하게하고, 그 메소드를 호출한다는 것입니다.

해결하기가 어렵지 않습니다. 예를 들어 NSInvocation을 만들어 호출을 캡슐화 한 다음 각 "대리인"에게 호출을 보낼 수 있습니다. 그러나 그렇게하면 알림 시스템이 거의 재발행 될 것입니다. 여러 대의 대표단 제안을 통해 얻을 수있는 일대 다 통신이 필요한 경우 알림 또는 KVO를 사용하는 것이 좋습니다.

+0

예, 대부분의 경우 일대 다 통신이 필요하며 위임은 약간 혼란에 빠지기 시작했습니다. 너희들이 내가 KVO로 옮겼다는 것을 제안 했으므로 꽤 잘 작동하고있다. 감사! – msoler