objective-c - 何时使用 NSNotificationCenter

标签 objective-c ios architecture observer-pattern nsnotificationcenter

我想让多个观察者观察单个对象的多个事件(1 对 N 关系)。

NSNotificationCenter 提供了实现此任务的机制。 .当用于我的问题时,该机制看起来有点矫枉过正。

如果不使用 NSNotificationCenter,我将如何手动完成:

- (void)addDelegate:(id<DelegateProtocol>)delegate;
- (void)removeDelegate:(id<DelegateProtocol>)delegate;

从我的对象中添加和删除观察者。

- (void)someEventFired:(NSObject<NSCopying> *)eventData
{
    for (id delegate in delegates) {
        NSObject *data = [eventData copy];
        [delegate someEventFired:data];
    }
}

这种机制简单明了且易于实现,对象无需共享额外的字符串。

  • 除了 NSNotificationCenter 之外,iOS 框架中是否有官方的 1 对 N 委托(delegate)模式(如 C# 事件)?
  • 什么时候应该使用NSNotificationCenter,什么时候不需要?
  • 什么时候应该使用我在这里建议的实现,什么时候不应该使用?

最佳答案

按照惯例,代理应该只用于 1:1 的关系。如果您真的需要这种类型的功能的 1:N 关系,您有两个选择:

  1. 如您所述,NSNotificationCenter .
  2. Key-Value Observing (也称为 KVO)。

如果您只关心对象的特定属性何时更改,则 KVO 是合适的。否则,你真的应该考虑使用 NSNotificationCenter。通过将特定对象传递到 addObserver:selector:name:object: 方法,您甚至可以仅在特定对象发布该通知时收到通知。

Apple 在类似的场景中使用了 NSNotification(例如为 UITextField 定义的通知,包括 UITextFieldTextDidBeginEditingNotificationUITextFieldTextDidChangeNotification、和 UITextFieldTextDidEndEditingNotification)。

关于objective-c - 何时使用 NSNotificationCenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10836463/

相关文章:

ios - 使用适用于 IOS 的 Google Maps SDK 时出现 Apple Mach-O 链接器错误

ios - 激活任何 Typhoon 程序集时出错

iphone - gzipInflate/gzipDeflate 错误

android - 开发跨平台应用程序

ios - 在移动的汽车中使用 iPhone 陀螺仪

iphone - 当没有单元格存在时单击 UITableView 的方法,以便键盘将关闭

c# - 使用其他模块中的类

Angular 微服务,从 url 加载子项

java - 将动态对象放入数据结构中

objective-c - 如何获取 uiTableviewCell 中的下一个索引路径