我刚读了几篇关于KVO的教程,但我还没有发现它存在的原因。是不是NSNotificationCenter更容易观察物体?
我是Stackoverflow的新手,所以请告诉我,我问这个问题的方式是否有问题!
答案 0 :(得分:15)
通知和KVO提供类似的功能,但有不同的权衡。
通知很容易理解。 KVO ......挑战......要理解(至少要理解如何使用它好)。
通知需要修改观察到的代码。被观察者必须明确地生成它提供的每个通知。只要观察到的代码符合KVC(无论如何它),KVO对观察到的代码是透明的。
即使您不使用通知,通知也会有开销。每次观察到的代码发布通知时,必须对系统中的每个观察进行检查,即使没有人观察到该对象(即使没有人观察任何事物)。如果系统中有超过几百个观测值,这可能非常重要。如果有几千个,这可能是一个严重的问题。对于任何未实际观察到的物体,KVO的开销为零。
总的来说,我不鼓励KVO,因为我认为某些特定的实施问题会使其难以正确使用。如果没有超级类的特殊知识,很难观察到你的超类也会观察到的对象。它严重依赖字符串文字使编译时难以捕获小错别字。一般来说,我发现严重依赖它的代码变得复杂且难以阅读,并且开始拾起远距离错误的怪异动作。 NSNotification
代码往往更直接,您可以看到正在发生的事情。随机代码不会在你没想到的时候运行。
所有这一切,KVO是一个重要的功能,开发人员需要了解它。越来越多的低级对象依赖它,因为它具有零开销优势。但对于新开发人员,我通常建议他们更多地依赖通知而不是KVO。
还有第三种方式。您可以保留一个监听器列表,并在事情发生变化时向它们发送消息,就像委托方法一样。有些人称这些为“多播代理”,但“侦听器”在这里更正确,因为它们不像委托那样修改对象的行为。如果您需要在系统中进行大量观察,而不增加KVO的复杂性,那么这样做可能会比NSNotification
快得多。