2013-06-11 55 views
17

我一直在玩NSNotificationCenter,我一直在想你什麼時候可以使用自己的自定義通知中心而不是defaultCenter?這有什麼好處呢?何時創建自定義NSNotificationCenter?

原諒我的無知,但似乎我可以相當愉快地相處,只是使用defaultCenter而沒有別的,但我想確保我不會錯過重要的東西。

+5

合法的問題,我一直在使用* defaultCenter *而不在意它。 –

回答

11

蘋果文檔是模糊的,它只是指出,通常程序員不會需要創建一個新的:

每個運行可可程序有一個默認的通知中心。你通常不會創建自己的。 NSNotificationCenter對象只能在單個程序中傳遞通知。

全部來源:NSNotificationCenter documentation

但是,每個通知中心都可以處理通過名稱和對象進行區分的通知網絡。當您添加一個觀察者,你通常要求以某種方式方法是這樣的:

[center addObserver: self selector: @selector(observe:) name: @"observe" object: someObject]; 

當你發佈一個通知,您可以指定對象:

[center postNotificationName: @"observe" object: someObject]; 

這樣說,你用了N參數名稱和M個對象,您可以處理N * M個區分的通知。我認爲不需要使用兩個通知中心。從理論上講,如果你已經完成了所有的名字,你可以使用alloc + init創建另一個名字,但是我幾乎不知道它是如何變得方便的。

另外考慮到通知中心通常在有兩個對象沒有相互指向的直接指針(否則爲什麼不簡單地調用它的方法?)時使用,因爲避免了複雜的綁定(特別是當您使用很多xib文件),因此擁有一個獨特的通知中心對象非常方便。

如果您使用帶有allot + init的通知中心,那麼您必須確保所有通信對象都有指向該通知中心的指針,這會增加一些複雜性。所有通知中心的權力都將被浪費。

8

儘管它通過defaultCenter singleton訪問器在AppKit中大量使用,但它的核心是NSNotificationCenter實際上只是一種「通用解耦機制」。允許你自己的實例只是這種通用性的表達。如果你想用它來做其他事情,你可以。

要用一個有點荒謬的例子來說明,可以這樣想:NSDocument有一個windowControllers訪問器,它返回一個特定的,有福的,重要的NSArray實例,它包含對該文檔特定的所有窗口控制器的引用。也就是說,NSArray只是一個「通用列表數據結構」。僅僅因爲存在具有特定目的的這個特殊實例並不意味着爲了您自己的目的重用NSArray可能沒有用處。 NSArray和NSNotificationCenter都提供了通用數據結構/構建塊,其中的特定實例在AppKit周圍的有用「職業」中使用,但兩者都可以自行使用。

我在創建NSNotificationCenter的獨立實例時看到的主要用例是,您希望在多個線程上並行運行一些複雜子系統的多個實例,而不會讓它們被跨線程通知困惑。在這種情況下,一般模式是爲每個線程分配一個NSNotificationCenter。這將每個對象網絡的通知劃分到單個線程。如果觀察者通過nil獲取對象參數,意圖收聽所有具有給定名稱的通知,則無論來源如何,通常都需要這樣做。所有這些說法,我承認,根據我的經驗,使NSNotificationCenter的私人實例非常罕見。