测试NSObject是否正在观察字符串

时间:2013-06-21 01:10:47

标签: key-value-observing nsnotificationcenter nsobject

我有一个NSObject,可以监听~30个字符串信号。我想向这个对象发布任意数量的字符串。但我首先想测试它是否正在观察当前的字符串。

[NSNotificationCenter][1]的文档并未暗示这是可行的。只有添加/删除删除观察者和发布通知方法。

KVO的文档让我觉得可以使用[[NSNotificationCenter defaultCenter] observationInfo]方法。我不知道如何使用返回的void*。文档说明了返回值:

  

一个指针,用于标识所有观察者的信息   在接收器上注册,使用的选项   注册时间,等等。

我特别欣赏“等等”。那是最有帮助的部分......叹息。

考虑到对象处理的信号数量,我不想手动检查每个字符串。是否有一种优雅的方法来检查对象是否在NSObject级别或不使用私有API的KVO级别观察字符串(try / catch不符合条件)?

感谢。

1 个答案:

答案 0 :(得分:1)

-observationInfo使用的指针对你来说是不透明的(即毫无意义);这只是一个象征。从标题(强调我的):

  

获取或返回一个标识所有信息的指针   在接收器上注册的观察者,那些选项   在注册时使用等。这些的默认实现   方法将观察信息存储在由键控的全局字典中   接收者的指针。为了提高性能,您可以覆盖这些   将不透明数据指针存储在实例变量中的方法。   覆盖这些方法不得尝试发送Objective-C   传递给观察信息的消息,包括-retain和   -release

此外,KVO观察和NSNotificationCenter观察是两个完全独立的机制,它们之间没有关系。两者都没有提供任何公共API来确定谁在观察什么。我可以设想跟踪观察的唯一方法是覆盖添加/删除方法(通过KVO的方法覆盖或通过调用NSNotificationCenter上的方法),然后自己跟踪观察信息。

我不是故意成为“那个家伙”,而是想知道谁在观察通常是红旗的东西是不是很好的架构。如果你担心表现,我不会。 KVO和NSNotificationCenter是相当快/低开销的机制。大约30个观察结果都不是。我不担心。