目标C中的多个代表
我来自C#事件模型,我想知道是否有一个标准的方式来通知事件的多个代表?
我有一个ClassCDelegate协议,我希望ClassA和ClassB都可以实现。 有没有办法,我可以分配ClassC ClassA和ClassB的实例作为委托,而不必手动创build一个委托variables的ClassC列表,并遍历它们?
cocoa代表被用来完成控制的反转,减less了子类化的需要。 一个对象有多个委托是完全可能的,但这是在将不同的对象委托给不同的决策时有意义的。 一个很好的例子就是来自WebKit的WebView
,它有五个代表负责资源加载和导航策略。
C#的事件委托系统允许一个对象注册一个特定的事件发生时被通知的另一个对象,最接近Cocoa提供的几个通知API。 您可能遇到的各种API从最高层到最低层:
-
NSNotificationCenter
-
NSDistributedNotificationCenter
-
CFNotificationCenter
- 达尔文通知。
所有的精神都是相似的,所以我只会考虑在这种情况下使用的一个: NSNotificationCenter
。
观察员,如ClassA和ClassB,注册他们与NSNotificationCenter
通知的兴趣。 他们可以指定一个兴趣
- 具有特定对象的特定名称的通知
- 具有来自任何对象的特定名称的通知
- 来自特定对象的通知。
当通知中心发布匹配通知时,通过在通知中心注册时调用他们提供的方法来通知观察者。 该方法总是具有相同的types:它不返回任何内容,并接受一个参数,一个NSNotification
对象。
通常情况下,您可以通过让ClassC在其头文件中声明通知名称的常量来处理您的情况,例如,
extern NSString *const ClassCSomethingDidHappenNotification;
有兴趣的观察者,例如ClassA和ClassB,然后可以注册这个通知的兴趣:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSomethingDidHappen:) name:ClassCSomethingDidHappenNotification object:aClassCObject];
除了注册select器并向观察者添加方法来处理callback之外,还可以在发布匹配通知时注册一个操作队列和一个在该队列上执行的块。
当发生与通知相关的事件时,ClassC将通知发送到通知中心:
[[NSNotificationCenter defaultCenter] postNotificationName:ClassCSomethingDidHappenNotification object:self];
然后,通知中心将查看观察者列表,find匹配此通知的列表,并调用相应的方法。
通知中心的替代scheme是使用NSProxy子类转发消息,详细信息请参见:
http://engineering.hoteltonight.com/handling-multiple-delegates-in-ios
HTDelegateProxy类可在以下位置获得:
您也可以让一个对象处理该事件,然后将其转发给第二个对象。
还有一点很重要,那就是通知是一条单向的街道 – 他们不能像代表那样发回信息。 唯一的情况是你想迭代一个委托列表,如果你的委托类期望从它的委托的信息。
你只能有一个委托对象。 如果你想通知各种变化的对象,你应该使用NSNotificationCenter并发布对象可以监听的NSNotification消息。
试试MultiDelegate它可以让你将委托方法转发给任意数量的委托对象。