2012-01-08 48 views
3

到目前爲止,我一直在使用NSNotificationCenter的方法postNotification:aString object:anyObjectOfInterestForTheReceiver。但最近我在文檔中看到object字段只能通過self。有沒有什麼可怕的副作用,我不知道應該說服我將來只通過self,還是可以通過任何對象? 謝謝!NSNotification:對象屬性必須是自我嗎?

回答

7

您可以傳遞任何對象作爲通知的object,但慣例是object是「正在進行通知的事物」(並且您在userInfo字典中放置了其他相關狀態)。

之所以主要是因爲self是因爲通常進行通知的對象通常都想引用自己。這樣一來,例如,如果您有很多Foo對象,並且其中一個完成了任務併發送了通知,則任何觀察該通知的人都可以查看object以查看哪個Foo是有問題的。遵循此方案時,觀察員也可以選擇僅觀察來自特定Foo的通知。

在發佈通知時使用除「自我」之外的東西也是合理的(雖然不太常見) - 假設您正在「代表」另一個對象發送通知。例如,您可能是一個單身控制器對象,可以完成Bar任務,並且您可以發送該通知時引用特定的Bar作爲對象。這比使用單身作爲object更有意義,因爲那裏沒有有趣的變化。

同樣,這只是一個(有用的)約定。當你編寫自己的通知時,你可以定義通知的「合同」,即名稱,使用什麼樣的對象作爲object,以及userInfo中的內容。

1

如果事件真的有發件人,這是至關重要的。

註冊觀察者時,可以指定要觀察的發件人。如果您讓其他人使用您的郵件,那麼正確傳遞發件人至關重要,否則綁定到特定發件人的觀察者將無法收到您的郵件。

2

是的,有一個我能想到的副作用。讓我解釋一下。

您談談NSNotification.h實際上是定義如下的方法:notificationSender

第一個參數(ID):

  • (無效)postNotificationName:(的NSString *)notificationName對象notificationName代表通知的名稱。 第二個參數notificationSender代表發佈通知的對象。

    是的,任何對象都可以是通知發送者,甚至可以是。

    在observering通知的條款(以成爲特定通知的觀察者),我們才知道在NSNotification定義的另一個方法:notificationObserver選擇器(ID):

    • (無效)的addObserver(SEL )notificationSelector名稱:(NSString *)notificationName對象:(id)notificationSender

    正如您所見,最後一個參數是notificationSender(觀察者希望接收其通知的對象)。

    所以現在,副作用顯然是。讓我詳細解釋一下。例如有三個控制器A,B,C。控制器A發佈通知helloEveryone。控制器B還發布通知helloEveryone。
    在C控制器,如果你把象下面這樣的語句:

    [[[NSNotificationCenter defaultCenter]的addObserver:自我選擇:@selector(helloEveryOne)名稱:@ 「helloEveryone」 對象:無]

    然後你將收到來自控制器A和B. 2個helloEveryone如果你把這樣的語句:

    [[[NSNotificationCenter defaultCenter]的addObserver:自我選擇:@selector(helloEveryOne)名稱:@ 「helloEveryone」 對象:controllerA]

    然後你會收到來自控制器A.只有一個helloEveryone

    肯定不是零通知發送者,只要它可以發佈一個通知,但使用另一個對象作爲通知發送者,可能是它是一個零對象。觀察者的行爲在通知發送者是否爲零方面是不同的。

相關問題