【问题标题】:Best practice for NSNotificationsNSNotifications 的最佳实践
【发布时间】:2012-04-09 00:18:31
【问题描述】:

在我正在编程的游戏中,我为游戏中的所有实体使用复合对象。实体由定义小块功能(例如健康或运动)的组件对象组成。

我的问题是:

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

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

有人告诉我,你永远不应该为另一个对象发布通知。

有什么好处和坏处?

【问题讨论】:

  • 也许从凝聚力的角度重新提出问题会更好。也就是说,观察者是在看复合对象还是细粒度对象?例如,当生命值达到零时,您的复合对象不是更高级别的事件(死亡事件)吗?

标签: objective-c ios design-patterns


【解决方案1】:

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

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

此外,如果您有很多单独的组件都发布通知,如果您想更改通知(例如,其中的 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

【讨论】:

  • 我的健康组件在健康达到零时发布通知。如果我按照您的建议转发它,即使没有健康组件,父级上总会有一个方法。
  • 好吧,如果这对您的情况没有意义,请不要那样做!这是对一种可能的方法的建议,而不是要求。
猜你喜欢
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2014-10-08
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多