当前位置:  开发笔记 > 编程语言 > 正文

目标C中的多个代表

如何解决《目标C中的多个代表》经验,为你挑选了2个好方法。

我来自C#事件模型,我想知道是否有一种标准方式来通知多个代表的事件?

我有一个ClassCDelegate协议,我希望ClassA和ClassB都能实现.有没有办法我可以将ClassA的实例分配给ClassA和ClassB作为委托,而无需在ClassC中手动创建委托变量列表并迭代它们?



1> Jeremy W. Sh..:

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];

然后,通知中心将查看观察者列表,找到与此通知匹配的观察者,并调用适当的方法.



2> Jacob Jennin..:

通知中心的替代方法是使用NSProxy子类转发消息,详细信息请参见以下内容:

http://engineering.hoteltonight.com/handling-multiple-delegates-in-ios

HTDelegateProxy类可在以下位置获得:

https://github.com/hoteltonight/HTDelegateProxy

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有