我来自 C# 事件模型,我想知道是否有一种标准方法可以通知多个代表一个事件?
我有一个 ClassCDelegate 协议(protocol),我希望 ClassA 和 ClassB 都实现。有没有一种方法可以将 ClassC 的实例同时分配为 ClassA 和 ClassB 作为委托(delegate),而无需在 ClassC 中手动创建委托(delegate)变量列表并遍历它们?
最佳答案
Cocoa 委托(delegate)用于完成控制反转并减少对子类化的需求。一个对象完全可以有多个委托(delegate),但是当将不同类型的决策委托(delegate)给不同的对象有意义时,就会这样做。一个很好的例子是来自 WebKit 的 WebView
,它有五个代表负责资源加载和导航策略等不同领域。
C# 的事件委托(delegate)系统允许一个对象向另一个对象注册以在特定事件发生时得到通知,它最接近 Cocoa 提供的几个通知 API。您可能遇到的各种 API,从最高级别到最低级别:
NSNotificationCenter
NSDistributedNotificationCenter
CFNotificationCenter
在本质上都是相似的,所以我只考虑你在这种情况下使用的那个:NSNotificationCenter
。
观察者,例如 ClassA 和 ClassB,通过 NSNotificationCenter
注册他们对通知的兴趣。他们可以指定对
当匹配的通知发布到通知中心时,观察者会通过调用他们在通知中心注册时提供的方法得到通知。该方法始终具有相同的类型:它不返回任何内容并接受单个参数,即 NSNotification
对象。
您通常会通过让 ClassC 在其头文件中为通知名称声明一个常量来处理您的情况,例如,
extern NSString *const ClassCSomethingDidHappenNotification;
感兴趣的观察者,例如 ClassA 和 ClassB,可以注册对此通知的兴趣:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleSomethingDidHappen:)
name:ClassCSomethingDidHappenNotification
object:aClassCObject];
除了注册一个选择器并向观察者添加一个方法来处理回调,您现在还可以注册一个操作队列和一个 block ,以便在发布匹配的通知时在该队列上执行。
当与通知相关的事件发生时,ClassC 将通知发布到通知中心:
[[NSNotificationCenter defaultCenter]
postNotificationName:ClassCSomethingDidHappenNotification
object:self];
然后通知中心将查看观察者列表,找到与该通知匹配的观察者,并调用适当的方法。
https://stackoverflow.com/questions/1382241/