我来自C#event model,我想知道是否有一种标准的方式来通知一个事件的多个代表?
我有一个ClassCDelegate协议,我希望ClassA和ClassB都能实现.有没有一种方法可以将ClassC的一个实例既分配给ClassA又分配给ClassB作为委托,而不必在ClassC中手动创建委托变量列表并遍历它们?
我来自C#event model,我想知道是否有一种标准的方式来通知一个事件的多个代表?
我有一个ClassCDelegate协议,我希望ClassA和ClassB都能实现.有没有一种方法可以将ClassC的一个实例既分配给ClassA又分配给ClassB作为委托,而不必在ClassC中手动创建委托变量列表并遍历它们?
Cocoa委托用于实现控制反转,并减少子类化的需要.一个对象完全可以有多个委托,但如果将不同类型的决策委托给不同的对象是有意义的,就可以这样做.WebKit的WebView
名代表就是一个很好的例子,他们有五名代表负责资源加载和导航策略等领域.
C#的event–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];
现在,您也可以注册一个操作队列和一个块,以便在发布匹配通知时在该队列上执行,而不是注册一个 Select 器并向观察者添加一个方法来处理回调.
当与通知关联的事件发生时,ClassC将通知发布到通知中心:
[[NSNotificationCenter defaultCenter]
postNotificationName:ClassCSomethingDidHappenNotification
object:self];
然后,通知中心将查看观察者列表,找到与此通知匹配的观察者,并调用相应的方法.