objective-c - Objective C 中的多个委托(delegate)

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

我有一个 ClassCDelegate 协议(protocol),我希望 ClassA 和 ClassB 都实现。有没有一种方法可以将 ClassC 的实例同时分配为 ClassA 和 ClassB 作为委托(delegate),而无需在 ClassC 中手动创建委托(delegate)变量列表并遍历它们?

最佳答案

Cocoa 委托(delegate)用于完成控制反转并减少对子类化的需求。一个对象完全可以有多个委托(delegate),但是当将不同类型的决策委托(delegate)给不同的对象有意义时,就会这样做。一个很好的例子是来自 WebKit 的 WebView,它有五个代表负责资源加载和导航策略等不同领域。

C# 的事件委托(delegate)系统允许一个对象向另一个对象注册以在特定事件发生时得到通知,它最接近 Cocoa 提供的几个通知 API。您可能遇到的各种 API,从最高级别到最低级别:

  • NSNotificationCenter
  • NSDistributedNotificationCenter
  • CFNotificationCenter
  • Darwin 通知。

在本质上都是相似的,所以我只考虑你在这种情况下使用的那个:NSNotificationCenter

观察者,例如 ClassA 和 ClassB,通过 NSNotificationCenter 注册他们对通知的兴趣。他们可以指定对

的兴趣
  • 来自特定对象的具有特定名称的通知
  • 来自任何对象的具有特定名称的通知
  • 来自特定对象的通知。

当匹配的通知发布到通知中心时,观察者会通过调用他们在通知中心注册时提供的方法得到通知。该方法始终具有相同的类型:它不返回任何内容并接受单个参数,即 NSNotification 对象。

您通常会通过让 ClassC 在其头文件中为通知名称声明一个常量来处理您的情况,例如,

extern NSString *const ClassCSomethingDidHappenNotification;

感兴趣的观察者,例如 ClassA 和 ClassB,可以注册对此通知的兴趣:

[[NSNotificationCenter defaultCenter]
  addObserver:self
     selector:@selector(handleSomethingDidHappen:)
         name:ClassCSomethingDidHappenNotification                
       object:aClassCObject];

除了注册一个选择器并向观察者添加一个方法来处理回调,您现在还可以注册一个操作队列和一个 block ,以便在发布匹配的通知时在该队列上执行。

当与通知相关的事件发生时,ClassC 将通知发布到通知中心:

[[NSNotificationCenter defaultCenter]
  postNotificationName:ClassCSomethingDidHappenNotification
                object:self];

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

https://stackoverflow.com/questions/1382241/

相关文章:

objective-c - 在 mac 包中嵌入字体

iphone - 如何以编程方式区分 iphone 4 和 iphone 4S?

objective-c - 如何从 C 方法调用 Objective-C 方法?

c - 在 Objective-C 类中混合 C 函数

iphone - 从 float 或 double 实例化 NSDecimalNumber 的正确方

objective-c - 在 ARC 之后,我应该为调度队列使用什么属性?

iphone - 在 Objective-C 中随机化 NSArray 的规范方法

ios - 使用钩子(Hook)在 Instagram 上发布视频

objective-c - NSMutableDictionary 线程安全

objective-c - 如何在没有 Interface Builder 的情况下创建 Cocoa