我来自C#事件模型,我想知道是否有一种标准方式来通知多个代表的事件?
我有一个ClassCDelegate协议,我希望ClassA和ClassB都能实现.有没有办法我可以将ClassA的实例分配给ClassA和ClassB作为委托,而无需在ClassC中手动创建委托变量列表并迭代它们?
Cocoa委托用于完成控制的反转并减少子类化的需要.完全可能为单个对象设置多个委托,但是当将不同类型的决策委托给不同对象时,这是可行的.一个很好的例子WebView
来自WebKit,它有五个代表负责资源加载和导航策略等多种领域.
C#的事件委托系统允许一个对象注册另一个对象,以便在特定事件发生时得到通知,它最接近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];
现在,您还可以在发布匹配通知时注册操作队列和要在该队列上执行的块,而不是注册选择器并向观察者添加方法来处理回调.
当与通知关联的事件发生时,ClassC将通知发布到通知中心:
[[NSNotificationCenter defaultCenter] postNotificationName:ClassCSomethingDidHappenNotification object:self];
然后,通知中心将查看观察者列表,找到与此通知匹配的观察者,并调用适当的方法.
通知中心的替代方法是使用NSProxy子类转发消息,详细信息请参见以下内容:
http://engineering.hoteltonight.com/handling-multiple-delegates-in-ios
HTDelegateProxy类可在以下位置获得:
https://github.com/hoteltonight/HTDelegateProxy