2011-08-12 71 views

回答

15

通知和KVO提供類似的功能,但具有不同的權衡。

  • 通知很容易理解。 KVO是......挑戰......理解(至少了解如何使用它以及)。

  • 通知需要修改觀察到的代碼。觀察者必須明確地生成它提供的每個通知。只要觀察到的代碼符合KVC(無論如何),KVO對觀察到的代碼都是透明的。

  • 即使您不使用它們,通知也會有開銷。每當觀察到的代碼發佈通知時,即使沒有人觀察該對象(即使沒有人觀察到任何內容),也必須針對系統中的每個觀察結果進行檢查。如果系統中有超過幾百個觀察值,這可能非常不平凡。如果有幾千人,這可能是一個嚴重的問題。對於沒有實際觀察到的任何物體,KVO沒有任何開銷。

一般情況下,我勸阻因爲我相信使它很難正確地使用一些具體的實施問題志願。如果你的超類沒有特別的知識,你很難觀察到你的超類也觀察到了這個對象。它嚴重依賴字符串文字,使得在編譯時難以捕捉到小的錯字。總的來說,我發現很大程度上依賴於它的代碼變得複雜而難以閱讀,並且開始挑選出一些令人毛骨悚然的遠程操作錯誤。 NSNotification代碼往往更直接,你可以看到發生了什麼。隨機代碼不會在你沒有料到的時候運行。

所有這一切,KVO是一個重要的功能,開發人員需要了解它。越來越多的低級對象依賴它,因爲它具有零開銷優勢。但對於新開發人員,我通常建議他們更多地依賴通知而不是KVO。

還有第三種方法。您可以保留一個監聽器列表,並在事情發生變化時向他們發送消息,就像委託方法一樣。有些人稱這些「多播委託人」,但「聽衆」在這裏更加正確,因爲他們不像委託人那樣修改對象的行爲。如果您需要在系統中進行大量觀察而不增加KVO的複雜性,則以這種方式執行此操作可能會比NSNotification快得多。

+0

謝謝你,羅伯! >即使您不使用它們,通知也會有開銷。每當觀察到的代碼發佈一個通知時,即使沒有人觀察該對象(即使沒有人觀察到任何事物),也必須針對系統中的每個觀察結果進行檢查。 解決這個問題不能發佈到不同的NSNotificationCenter(s)嗎?難道這不能提高性能,我不確定 –

+2

是的,管理單獨的NSNotificationCenters將提高搜索性能。我所描述的「聽衆」模式基本上是這個的最終演變,基本上給每個單獨的對象一個自己的通知中心(這是我最初玩的一個實現)。多個通知中心的主要問題是它是一種不尋常的模式,可能會混淆其他開發人員。當他們使用錯誤的中心時,它只是悄無聲息,他們不知道爲什麼。但原則上沒有錯。 –

+0

更好地遵循此鏈接:http://nshipster.com/nsnotification-and-nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn/ –

相關問題