讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 13.4 通知與KVO >

13.4 通知與KVO

可以使用通知(參見第11章)實現概念上遠離的兩個對像間的通信,同時兩個對像間又不必看到彼此。這兩個對象的共同點是它們都要知道通知的名字。每個對象都能看到通知中心(它是個全局的可見對像),因此每個對象都可以發送或接收通知。

以這種方式使用通知看起來有些逃避責任,沒有以顯而易見的方式來架構你的對象。不過有時,一個對像不需要知道,也不應該知道發送消息的對象到底是什麼。

回憶一下第11章的示例。在這個簡單的紙牌遊戲應用中,遊戲需要知道用戶什麼時候輕拍了紙牌。在用戶輕拍時,紙牌對遊戲一無所知,只是通過發送通知發出了聲音而已;遊戲對像已經註冊了該通知,並開始進行處理:


NSNotificationCenter.defaultCenter.postNotificationName(
    "cardTapped", object: self)
  

再來看一個示例,這個示例利用了通知就是一種廣播機制的事實。在我開發的一個應用中,應用委託需要銷毀界面,然後從頭開始再構建出來。要想不造成內存洩漏(以及其他影響),當前運行著重複NSTimer的每個視圖控制器都需要將其定時器置為無效狀態(參見第12章)。相對於找出這些視圖控制器,並為每個視圖控制器添加一個方法進行調用,我只需發送一個通知,讓應用委託發出「Everybody stop timers!」。運行定時器的所有視圖控制器都註冊了該通知,它們知道在接收到這個通知後應該做什麼。

與之類似,KVO(參見第11章)可用於實現概念上遠離的兩個對像之間的同步:當一個對象的一個屬性發生變化時,另外一個對像會知曉這個變化。