2011-01-22 46 views
3

我的一部分認爲我理解NSNotification概念。這是一個基於字符串通知的集中式廣播系統。一邊張貼,觀察一邊或多邊,並據此採取行動。我的另一部分雖然需要編寫代碼,但每次需要通知時都會感到困惑。什麼樣的代碼進入哪個頭文件/實現,哪些文件實際上在觀察,以及如何避免它變成一團糟?把時間弄清楚,你能幫我驗證這些假設嗎?我對第四名相當有信心,但是第五名碰到了混亂困境。NSNotification概念 - 哪一段代碼在哪裏?


  1. NSNotifications與從[NSNotification defaultCenter]幫助下創建,一個不ALLOC /初始化一個NSNotification。正確?
  2. 執行postNofification專長的對象始終將self傳遞到發佈代碼:[[NSNotificationCenter defaultCenter] postNotificationName:@"note name" object:self]。正確?
  3. 事件冒泡存在於其他語言中,但不存在於具有NSNotification的Objective-C中。您不通過通知,您可以爲全球廣播制定足夠的通知名稱。正確?
  4. 如果您仍然希望傳遞由對象A發佈的通知,請在B中觀察它,處理它併發佈一個新的,更具體的通知以供對象C觀察。例如。從A到B有@"MenuItemTapped",從B到C有@"NavigateTo"。對不對?
  5. 通知的名稱是NSString。因爲海報和觀察者都希望避免輸入錯誤,所以我們將NSString常量存儲在[extern const | define | class method | above]中。你能幫我挑一個嗎?
    • 一次嘗試是創建類似於NotificationNames.h文件的文件,該文件將包含所有extern NSString *const NOTE_NAME聲明。然而,這破壞了通知的可移植性。
    • 另一個嘗試是NSNotification的子類化(使用XCode模板來快速創建),但是因爲這個概念是從AS3中的事件類繼承而來的,所以它看起來非常不客觀。還有一種奇怪的是,你不能在NSNotification上調用[super init],所以事情開始失控。
    • 我的煩惱與這一個來自繁瑣的#import陳述。如何最小化錯字,但保持常量/定義是否可移植?
+2

另外,最好是在dealloc中刪除所有觀察者,並將其添加到NSNotificationCenter中。 – 2011-01-22 16:30:29

回答

4

你大都知道了。你的數字1-3通常是正確的。

  • 你不應該永遠不需要分配你自己的NSNotification對象。
  • 通常,如您所說,您通常會將「自我」作爲通知的「對象」,但如果您在概念上「代表」別的事情通知其他事情,也可以傳遞其他內容。但那不太常見。
  • 通知與用戶界面中的「事件」不同。可可確實有事件;他們是鼠標/鍵盤/觸摸事件,他們通過UI對象「響應」鏈「泡沫」。通知是與UI無關的完全獨立的機制,並且通常用於其他解耦/獨立對象中的全局廣播。這更類似於有一個對象的多個代表。
  • 是的,您應該在任何使用它的人都可以看到的地方定義通知的名稱。在可可本身,這通常是一個公開的標題,其聲明如extern NSString *const UIKeyboardDidShowNotification。在一些私有實現文件中是定義。

關於上述#4的特別說明。將通知視爲通知,而不是指令。他們通常會捕捉狀態變化或廣泛的有趣事件。 「MenuItemTapped」是一個合理的事情通知,但「NavigateTo」通常不是,因爲其含義是,你告訴某個特定對象在某處導航。如果是這種情況,那麼該對象應該是想要導航的事物的代表(或者應該是屬性),並且應該使其直接發生。當然,這不是必需的,你可以使用這個機制來做任何你想要的。但可可設計模式通常不會將通知用於「告訴對象該做什麼」,只是爲了「告訴誰在乎將會發生什麼」。合理?

最後,特別是:#4中的例子 - 那些聽起來像真正的UI事件,似乎整個事情都可以通過委託來處理,除非有某些理由需要這些對象解耦。

+0

關於通知名稱的通知字符的深入瞭解。感謝您提出委託方案。這也應該在列表中。我想我應該更多地依賴委託而不是通知廣播,但是每次我想通知容器對象時都要創建一個委託協議,這似乎是一個非常詳細的解決方案。我是否也可以不正確地參與代表? – epologee 2011-01-22 17:12:42

+0

備註:在AS3中,有一個框架可以替代AS3事件與ObjC代表之間的事件。它被稱爲signals-as3,受Qt中C#事件和信號/插槽的啓發。也許在Objective-C中有一個類似的壯舉框架呢? – epologee 2011-01-22 17:20:58

2
  1. 如果您願意,您可以直接創建NSNotification對象。 postNotificationName:object:只是一個便捷的方法,可以爲您創建,配置和發佈通知對象。

  2. 您可以傳遞任何您喜歡的對象。它的目的是允許通知訂閱者僅接收關於特定對象的通知,因此理想情況下,您傳遞通知所關注的對象,這通常會(但不總是)成爲self

  3. 通知不是事件。它們是應用程序內的全局廣播。

  4. 您不會發送通知給特定對象 - 它們是廣播。如果你想發送消息給特定的對象,你只需要調用該對象的方法。

  5. 頭文件中的Externs很好。