[번역] Cocoa Fundamentals Guide : Notification

1Consumption·2020년 3월 4일
2

Cocoa Design Patterns

목록 보기
2/2
post-thumbnail

이 글은 Cocoa Fundamentals Guide: Notification을 번역한 글입니다.
부족한 영어실력으로 번역하여 오역이 있을 수 있습니다.

Notification

객체 간에 정보를 전달하는 표준 방법은 한 객체가 다른 객체의 메소드를 호출하는 message passing 입니다. 그러나, message passing은 메시지를 보내는 객체가 수신자가 누구인지, 그리고 어떤 메시지에 응답하는지를 알아야 합니다. 이 요구 사항은 delegation message와 다른 유형의 메세지에 적용됩니다. 때로는, 이 두 객체간의 단단한 결합이 바람직 하지 않습니다. 대부분 두 개의 독립적인 서브시스템들이 서로 결합되기 때문입니다. 그리고 어플리케이션에서 서로 다른 여러 객체 간에 하드 코딩으로 이루어진 연결이 필요하기 때문에 그것은 실용적이지 않습니다.

표준 message passing이 불가능한 경우, Cocoa는 notification의 브로드캐스트 모델을 제공합니다. notification 매커니즘을 사용하면, 한 객체가 다른 객체에게 자신이 수행하는 작업을 계속 알릴 수 있습니다. 이런 의미에서, delegation과 미슷하지만, 그 차이점은 중요합니다. delegation과 notification의 차이는 전자(delegation)가 one-to-one 통신(delegation 객체와 delegate객체 사이)이라는 점입니다. 하지만 notification은 잠재적으로 one-to-many통신(브로드캐스트) 입니다. 객체는 하나의 delegate만 가질수 있지만, notification의 수신자를 알 수 있기 때문에 많은 observer들을 가질 수 있습니다. 그리고 그 객체는 observer들이 무엇인지 알 필요가 없습니다. 모든 객체는 notification을 통해 간접적으로 이벤트를 관찰하고, 이벤트에 반응하여 자체적인 appearance, behavior, state를 조정할 수 있습니다. notification은 프로그램에서 coordination과 cohesion을 언기 위한 강력한 매커니즘입니다.

notification의 작동 방식은 개념적으로 간단합니다. 프로세스에는 notification center라고 불리는 객체가 있으며, 이 객체는 notification의 수신처 및 broadcast center역할을 합니다. 어플리케이션의 다른 곳에 있는 이벤트에 대해 알아야하는 객체는 해당 이벤트가 발생할 때 notification을 받을 수 있도록 notification center에 등록합니다. An example of this is a controller object that needs to know when a pop-up menu choice is made so it can reflect this change in the user interface. 이벤트가 발생하면, 이벤트를 처리하는 객체는 notification center에게 notification을 보내고, notification을 모든 관찰자에게 발송합니다. Figure 5 - 6은 이 매커니즘을 보여줍니다.

Note: notification center는 notification을 동기적으로 observer에게 제공합니다. posting 객체는 모든 notification이 전송될 때까지 다시 제어되지 않습니다. notification을 비동기적으로 보내고싶다면, Notification queue를 사용해야 합니다. notification queue는 명시된 notification을 지연시키고 notification center에 notification을 보내고 일부 명시된 기준에 따라 유사한 notification을 병합합니다.


[Figure 5 - 6] Posting and broadcasting a notification

모든 객체는 notification을 보낼 수 있으며 모든 객체는 notification center에 notification의 observer로 등록될 수 있습니다. notification을 발송하는 객체, 발송하는 객체가 notification에 포함하는 객체 및 notification의 observer는 모두 다르거나 같은 객체일 수 있습니다.(발송과 관찰 객체가 동일하도록 하는 것은 idle-time을 처리하는 것과 같이 그 용도가 있습니다.) notification들을 발송하는 객체는 observer들에 대해 아무것도 알 필요가 없습니다. 반면, observer들은 적어도 notification 객체에 의해 캡슐화된 notification name과 dictionary의 key를 알고 있어야 합니다.(Notification 객체는 notification객체의 구성요소를 묘사합니다.)

Further Reading: notification 매커니즘에 대한 자세한 내용은 Notification Programming Topics를 보십시오.


When and How to Use Notifications

delegation과 마찬가지로, notification 매커니즘은 어플리케이션의 객체 간 통신을 가능하게 하는 훌륭한 도구입니다. notificartion을 통해 어플리케이션 내의 객체는 해당 어플리케이션의 다른 곳에서 발생하는 변경 사항에 대해 알 수 있습니다. 일반적으로, 객체는 특정 이벤트가 발생하거나 발생하려고할 때 조정을 하려고 하기 때문에 알림의 관찰자로 등록됩니다. 예를 들어 custom view의 window 크기가 변경될 때 custom view의 모양을 바꾸고 싶은 경우, window객체가 보낸 NSWindowDidResizeNotification을 observe할 수 있습니다. noticiation은 또한 이벤트와 관련된 데이터의 dictionary를 포함할 수 있기 때문에 객체간에 정보를 전달할 수 있습니다.

하지만 notification과 delegation사이에는 차이점들이 있으며, 이러한 차이점들은 이 매커니즘들이 무엇에 사용되어야 하는지에 영향을 미칩니다. 앞서 서술한 것처럼, notidication model과 delegation model의 주된 차이점은 전자(notification)는 broadcast 매커니즘인 반면, delegation은 one-to-one 관계라는 점입니다. 각 model의 장점은 다음과 같습니다. notification에는 다음이 포함됩니다.

  • 보내는 객체는 observing객체의 identitiy를 알 필요가 없습니다.
  • 어플리케이션은 Cocoa framework에 의해 선언된 noticiation에만 국한되지 않습니다. 모든 클래스는 해당 인스턴스를 보내기위해 notification을 선언할 수 있습니다.
  • notification은 어플리케이션 내부 통신에만 국한되지 않습니다. distributed notification을 사용하면, 하나의 프로세스가 발생한 이벤트에 대해 다른 프로세으에게 알릴 수 있습니다.

iOS Note: distributed notification은 iOS에서 사용될 수 없습니다.

하지만 delegation의 one-to-one 모델도 장점을 가지고 있습니다. delegate는 delegation객체에 값을 반환하여 이벤트에 영향을 미칠 수 있는 기회를 줍니다. 반면 notification observer는 보다 수동적인 역할을 수행해야 합니다. 이벤트에 대응하여 오직 자신과 그 환경에만 영향을 미칠 수 있습니다. notification method들은 다음 signature가 있어야 합니다.

- (void)notificationHandlerName:(NSNotification *);

이 요구사항은 observing 객체가 어떤 직접적인 방법으로든 원래 이벤트에 영향을 미치지 못하도록 합니다. 그러나, delegate는 delegating 객체가 이벤트를 처리하는 방법에 영향을 미칠 수 있습니다. 또한 Appkit 객체의 delegate는 notification의 observer로 자동 등록 됩니다. framework 클래스에서 정의한 notification method를 통해 notification을 구현하기만 하면 됩니다.

notification 매커니즘은 객체 상태의 변화를 observing하는 유일한 Cocoa alternative가 아니며, 실제로 많은 상황에서 선호되지는 않습니다. Cocoa binding 기술, 특히 key-value observing(KVO) 밒 key-value binding(KVB) 프로토콜은 어플리케이션의 객체가 다른 객체의 속성 변화를 관찰할 수 있도록 해줍니다. binding 매커니즘은 notification 보다 이 기능을 더 효율적으로 수행합니다. binding에서 observed객체와 observing객체는 직접적이며, notification center같은 중간 개체가 필요하지 않습니다. 또한, binding 매커니즘은 대부분의 notification들과 같이 관찬되지 않은 변경사항에 대한 성능 저하를 부과하지 않습니다.

그러나 binding보다 notification을 선호하는 것이 합리적인 상황이 발생할 수 있습니다. 객체 속성 변경 이외의 이벤트를 관찰할 수 있습니다. 또는 KVO 및 KVB compliance를 구현하는 것이 비현실적일 수 있습니다. 특히 전송 및 관찰할 notification이 적은 경우에는 더욱 그렇습니다.

상황이 notification의 사용을 보장하더라도, 당신은 성능의 결과를 알아야 합니다. notification을 전송하려면 결국 norification center에 의해 observing 객체로 동기적으로 보내집니다. 이 문제는 전송이 동기적으로 수행되었는지 비동기적으로 수행되었는지에 관계없이 발생합니다. 만약 많은 observer들이 있거나, 각 observer가 notification을 처리하는 동안 많은 작업을 수행한다면, 당신의 프로그램은 상당한 지연이 발생할 수도 있습니다. 그러므로 notification의 남용이나 비효율적으로 사용ㅇ하는 것을 주의해야 합니다. notification 사용법에 대한 다음 가이드라인이 목표를 달성하는데 도음이 됩니다.

  • 어플리케이션에서 준수해야 하는 notification을 선택적으로 표시합니다.
  • notification 등록 시 notification 이름과 전송 객체에 대해 구체적으로 설명합니다.
  • notification을 처리하는 method들을 최대한 효율적으로 구현합니다.
  • 많은 oberver들을 추가 및 제거하는 것을 자제하십시오. 사용자가 접근할 수 있는 객체에 notification 결과를 전달할 수 있는 중간 observer가 있는 것이 더 좋습니다.

Further Reading: notification의 효율적인 사용에 대한 자세한 내용은 Cocoa Performance GuideLinesNotifications를 참고하십시오.

The Notification Object

notification는 NSNotification의 인스턴스인 객체입니다. 이 객체는 window gaining focus이나 네트워크 연결이 닫히는 것과 같은 이벤트에 대한 정보를 캡슐화 합니다. 이벤트가 발생하면, 이벤트를 처리하는 객체는 notification을 notification center에 전송하고, 이를 통해 즉시 모든 등록된 객체로 notification을 브로드캐스트 합니다.

NSNotification 객체에는 name, object, optional dictionary가 포합됩니다. name은 notification을 식별하는 태그입니다. object는 notification의 전송자가 해당 notification의 observer에게 보내려는 객체입니다. 이는 delegation message의 sender객체와 비슷하므로 수신자가 객체에 대한 정보를 query할 수있습니다. dictionary는 이벤트와 관련된 모든 정보가 저장됩니다.

Notification Centers

notification center는 notification들의 송수신을 관리합니다. 특정 기준을 충족하는 notification들의 observer들에게 알립니다. notification정보는 NSNotification객체에 캡슐화 되어 있습니다. 클라이언트 객체는 다른 객체들에 의해 보내진 특청 notification의 observer로 notification center에 등록됩니다. 이벤트가 발생하면, 객체는 적절한 notification을 notification center에 전송합니다. notification center는 메세지를 등록된 각 observer에게 발송하여 notification을 유일한 매개변수로 전달 합니다. 전송 객체와 observing 객체가 같을 수 있습니다.

Cocoa는 두 가지 유형의 notification center가 있습니다.

  • notification center(NSNotificationCenter의 인스턴스)는 단일 작업 내에서 notification을 관리합니다.
  • distributed notification center(NSDistributedNotificationCenter의 인스턴스)는 하나의 컴퓨터의 여러 작업의 notification을 관리합니다.
    다른 많은 Foundation 클래스와 달리 NSNotificationCenter는 Core Foundation counterpart(CFNotificationCenterRef)에 무료로 연결되지 않습니다.

NSNotificationCenter

각 작업에서는 NSNotificationCenter클래스의 메소드 defaultCenter를 사용하여 접근할 수 있는 default notification center가 있습니다. notification center는 단일 작업 내에서 notification을 처리합니다. 동일한 컴퓨터의 작업간에 통신하려면, disitributed notification center(DistributedNotificationCenter 참조)를 사용합니다.

notification center는 observer들에게 동기적으로 notification들을 제공합니다. 즉, 모든 obserer들이 notification을 수신하고 처리하기 전까지는 notification의 전송자는 통제권을 되찾지 못합니다. notification을 비동기적으로 보내려면 Notification Queues에 설명된 notification queue를 사용해야합니다.

멀티스레드 어플리케이션에서 notification들은 항상 notification이 보내진 스레드에 제공되며, 이 스레드는 observer가 스스로 등록한 스레드와 다를 수 있습니다.

profile
개발자가되고싶어요

0개의 댓글