2012-01-08 5 views
3

지금까지는 postNotification:aString object:anyObjectOfInterestForTheReceiver 메서드로 NSNotificationCenter를 사용했습니다. 그러나 최근에 나는 설명서에서 object 필드가 단지 self으로 전달되어야한다고 읽었습니다. 내가 모르는 사이에 끔찍한 부작용이 있습니까? 나에게 나중에 self을 전달하도록 설득해야합니까, 아니면 어떤 객체를 전달해도 괜찮습니까? 감사합니다.NSNotification : 객체 속성이 자체적이어야합니까?

답변

7

당신은 통지의 object 같은 개체를 전달할 수 있지만 규칙은 object는 "통고를하고있는 것"이라는 것이다 (당신은 userInfo 사전에 다른 관련 상태를 넣어).

일반적으로 대부분 self 인 이유는 일반적으로 알림을 보내는 개체가 자체적으로 참조하기를 원하기 때문입니다. 예를 들어 많은 수의 Foo 개체가 있고 그 중 하나가 작업을 완료하고 알림을 보낸 경우 알림을 보는 모든 사용자는 을보고 해당 질문이 Foo인지 확인할 수 있습니다. 관찰자는이 계획을 따를 때 특정 Foo의 알림 만 관찰하도록 선택할 수도 있습니다.

알림을 게시 할 때 "자기"외에 다른 것을 사용하는 것이 합리적입니다. 다른 개체 대신 "알림"을 보내는 경우를 가정 해 봅시다. 예를 들어 Bar 작업을 완료하는 싱글 톤 컨트롤러 개체 일 수 있으며 특정 Bar에 대한 참조를 개체로 사용하여 알림을 보낼 수 있습니다. 싱글 톤을 object으로 사용하는 것보다 의미가 있습니다. 흥미로운 차이가 없기 때문입니다.

다시 말하지만 (유용한) 규칙입니다. 자신의 알림을 작성할 때 알림의 "계약"을 정의 할 수 있습니다.이 계약의 이름은 어떤 종류의 개체가 object으로 사용되고 어떤 내용이 userInfo에 들어 있는지 정의합니다.

1

이벤트에 실제로 보낸 사람이있는 경우 중요합니다.

관찰자를 등록 할 때 관찰 할 송신자를 지정할 수 있습니다. 다른 사람들이 당신의 메시지를 사용하도록 내버려 두는 경우, 발신자를 올바르게 전달하는 것이 중요합니다. 또는 특정 발신자에게 구속력을 가진 사람은 당신의 메시지를받지 못할 것입니다.

2

예, 제가 생각할 수있는 부작용이 있습니다. 내가 설명 할께.

실제로 다음과 같이 NSNotification.h에 정의에 대해 이야기하는 방법 :

첫 번째 매개 변수 notificationSender (ID) :

  • (무효) postNotificationName : (있는 NSString *) notificationName 객체 notificationName은 통지의 이름을 나타냅니다. 두 번째 매개 변수 notificationSender는 알림을 게시하는 개체를 나타냅니다.

    예, 모든 개체가 알림 발신자 일 수 있습니다.

    • (무효) addObserver : (ID) 선택 notificationObserver : (SEL을 알림을 observering의 관점에서

      는 (특정 통지의 관찰자가되었다에), 우리는 또 다른 NSNotification에 정의 된 방법을 알고있어) notificationSelector 이름 : (NSString *) notificationName 객체 : (id) notificationSender

    마지막으로 알 수 있듯이 매개 변수는 notificationSender (관찰자가 수신하려는 알림이있는 객체)입니다.

    그래서 지금은 부작용입니다. 좀 더 자세하게 설명하겠습니다. 제어기 A, B, C는 세 가지 예가 있습니다. 컨트롤러 A는 helloEveryone 알림을 게시합니다. 또한 컨트롤러 B는 helloEveryone 알림을 게시합니다. C 컨트롤러에서
    , 아래 같은 문 배치하면 : 당신이 전무]

    다음 :

    [[[NSNotificationCenter defaultCenter] addObserver : 자기 선택기 : @ 선택기 (helloEveryOne) 이름 : @ "helloEveryone"개체를 이 같은 문을 배치하면 제어기 A와 B의 두 helloEveryone가 나타납니다

    [[[NSNotificationCenter defaultCenter] addObserver : 자기 선택기 : @ 선택기 (helloEveryOne) 이름 : @ "helloEveryone"개체 : controllerA]

    그럼 당신은 그것이입니다 수 있습니다,

    확실히 자기만큼이 알림을 게시 할 수 있습니다으로 전무 알림 보낸 사람이 컨트롤러 A.에서 하나의 helloEveryone을받을 수 있지만 알림 발신자로 다른 개체를 사용합니다 개체가 없습니다. 그리고 관찰자의 행동은 통지 발신자가 0인지 아닌지에 따라 다릅니다.