我想让多个观察者观察单个对象的多个事件(1 对 N 关系)。
NSNotificationCenter
提供了实现此任务的机制。 .当用于我的问题时,该机制看起来有点矫枉过正。
如果不使用 NSNotificationCenter
,我将如何手动完成:
- (void)addDelegate:(id<DelegateProtocol>)delegate;
- (void)removeDelegate:(id<DelegateProtocol>)delegate;
从我的对象中添加和删除观察者。
- (void)someEventFired:(NSObject<NSCopying> *)eventData
{
for (id delegate in delegates) {
NSObject *data = [eventData copy];
[delegate someEventFired:data];
}
}
这种机制简单明了且易于实现,对象无需共享额外的字符串。
- 除了
NSNotificationCenter
之外,iOS 框架中是否有官方的 1 对 N 委托(delegate)模式(如 C# 事件)? - 什么时候应该使用
NSNotificationCenter
,什么时候不需要? - 什么时候应该使用我在这里建议的实现,什么时候不应该使用?
最佳答案
按照惯例,代理应该只用于 1:1 的关系。如果您真的需要这种类型的功能的 1:N 关系,您有两个选择:
- 如您所述,
NSNotificationCenter
. - Key-Value Observing (也称为 KVO)。
如果您只关心对象的特定属性何时更改,则 KVO 是合适的。否则,你真的应该考虑使用 NSNotificationCenter
。通过将特定对象传递到 addObserver:selector:name:object:
方法,您甚至可以仅在特定对象发布该通知时收到通知。
Apple 在类似的场景中使用了 NSNotification
(例如为 UITextField
定义的通知,包括 UITextFieldTextDidBeginEditingNotification
、UITextFieldTextDidChangeNotification
、和 UITextFieldTextDidEndEditingNotification
)。
关于objective-c - 何时使用 NSNotificationCenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10836463/