KVO观察与NSNotificationCenter观察

问题描述:

我想知道是否有理由在KVO vs NSNotificationCenter观察中使用一个。性能,内存使用情况,速度等?KVO观察与NSNotificationCenter观察

这两个并不总是可以互换的。从概念上讲,KVO仅用于观察对象的属性。例如,您不能使用KVO来替换NSApplicationWillTerminateNotification,因为它通知观察者有关发生的事件,而不是对象属性的更改。

至于性能和内存使用情况,它们都很快并且使用的内存可以忽略不计。 NSNotificationQueue已合并停止通知洪水。就我所知,KVO没有任何合并,这确实给我带来了性能问题。我观察了数百个对象,当这些对象发生批量更新时,我会得到数百个KVO回调。这不是KVO本身的性能问题,而是由于批量更新而导致我自己的代码运行。

性能并不是真正的问题,它更多的是最适合这个问题。如果是属性更改,请使用KVO。如果它不是属性更改,则根据您是需要单个观察者还是多个观察者来使用委托或通知。

+1

啊。不知道通知的汇总。这对我来说是相当重要的。 – David

+2

通知最适用于不需要一个对象来了解某些特定其他对象的情况。例如,如果在应用程序中进行了一些设置更改,并且通知这些视图不必知道管理保留MVC的设置的对象,则可能需要刷新一堆视图。 –

一个非常古老的问题,但想到添加一些观点。我同意Tom Dalling's answer,但是,在大型应用程序中有很多场景,我们倾向于为对象的属性添加观察者,而我们不能,或者,我们错过了将其从观察者列表中删除。

让我们从我的应用程序中考虑以下情况 - ViewController显示一个蛇对象,我正在观察此对象上的属性更改 - “毒液”。所以无论viewController需要显示不同的蛇,我只需从该蛇对象的观察者中删除视图控制器。

该应用程序演变为一个蛇列表,而不是一条蛇,这意味着我必须观察该物体中所有蛇的属性。现在,当一个老蛇从数组中移除时,我应该了解这个事件,以便我可以从这个蛇对象中移除视图控制器作为观察者。要做到这一点,我必须首先观察阵列本身的变化。为此,我必须遵循特定的协议将对象插入到数组中,并将它们从数组中移除。这种复杂性依赖于此。我们都知道不从观察对象中删除观察者以及该对象是否被操作系统释放的后果!

以上只是一个例子举,这里的主要问题是我不能让志愿观察员名单给定对象从观察者删除此对象得到释放之前 - 这可以通过NSNotification并可以轻松实现NSNotificationCenter。有时,我倾向于使用NSNotification而不是KVO,但是,KVO总是在良好的设计实践方面具有优势。