Objective c NSN通知的最佳实践

Objective c NSN通知的最佳实践,objective-c,ios,design-patterns,Objective C,Ios,Design Patterns,在我正在编程的游戏中,我对游戏中的所有实体使用复合对象。这些实体由组件对象组成,这些组件对象定义了诸如健康或移动之类的小块功能 我的问题是: 是否可以发布来自组件的通知,但将其父实体引用为发送通知的对象 我很想这样做,因为向实体添加观察者比在实体中找到正确的组件更容易 有人告诉我,你不应该发布另一个对象的通知 利与弊是什么?通常您认为通知“来自”对象。因此,如果您正在调试,并且希望找到通知的源,那么可以在该对象本身中查找代码 违反这一期望并不违法,但当人们不得不更加努力地寻找通知的真正来源时,可

在我正在编程的游戏中,我对游戏中的所有实体使用复合对象。这些实体由组件对象组成,这些组件对象定义了诸如健康或移动之类的小块功能

我的问题是:

是否可以发布来自组件的通知,但将其父实体引用为发送通知的对象

我很想这样做,因为向实体添加观察者比在实体中找到正确的组件更容易

有人告诉我,你不应该发布另一个对象的通知


利与弊是什么?

通常您认为通知“来自”对象。因此,如果您正在调试,并且希望找到通知的源,那么可以在该对象本身中查找代码

违反这一期望并不违法,但当人们不得不更加努力地寻找通知的真正来源时,可能会让他们诅咒你一点

此外,如果您有许多单独的组件都发布了通知,那么如果您想要更改通知(例如,其中的userInfo),重构代码可能会变得更加困难

如果可以保证组件始终具有指向其父级的有效指针,那么最好的解决方案是让组件要求其父级发布通知:

@implementation ComponentA

- (void)someMethod
{
     [self.parent pleasePostSomethingChangedNotification];
}

@end

@implementation Parent

- (void)pleasePostSomethingChangedNotification
{
     // Parent may post the notification immediately,
     // or may selectively post the notification based on some other condition,
     // or post it later on after coalescing changes from several components, 
     // or ...
}

@end

我的运行状况组件在运行状况为零时发布通知。如果我像你建议的那样转发它,即使没有健康组件,也会在父级上始终有一个方法。好吧,如果在你的情况下没有意义,请不要这样做!这是对一种可能的方法的建议,而不是要求。也许从凝聚力的角度重新提出这个问题会更好。也就是说,观察者是在观察复合对象还是细粒度对象?例如,当运行状况为零时,事件不是在复合对象上处于更高级别(死亡事件)吗?