我来自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];

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

Objective-c相关问答推荐

Objective-C:为什么[对象复制]的两个请求返回相同的结果?

Objective-C - 将浮点数转换为字符串的其他方法

负数的奇怪 Objective-C Mod 行为

xcode 未知类型名称

iOS:将 URL 解析为段

块引用作为Objective-C中的实例变量

如何在 iPhone 上显示来自 API 的 HTML 文本?

无法加载从笔尖引用的图像

在 iPhone 应用程序中使用 RestKit 的最佳方式

iOS 8 Mapkit Objc 无法获取用户位置

反转 NSString 文本

iPhone 上 SQLite 的最佳 Cocoa/Objective-C 包装器库

如何从设置屏幕打开位置服务屏幕?

如何修复UIPopoverController 已弃用警告?

导航返回时重新加载 UITableView?

在 Objective-C 中计算两个日期之间的天数

根据文本量更改 UITableViewCell 高度

UIImageView 并不总是为模板图像着色

ARC 下的 NSString 属性应该是强的还是复制的?

如何在 iPhone SDK 中包含和使用新字体?