iOS通知中樞
iOS開發中的傳送訊息機制總的來說細分為三大類:
本地通知
推播通知
通知中樞
三者之間並沒有什麼直接性質的聯絡,通知中樞是嚮應用程式中註冊某個觀察者的所有對象廣播訊息,通過通知中樞可以很好的協調不同對象之間的訊息通訊。
注意:
每一個應用程式都有且只有一個通知中樞(NSNotificationCenter)執行個體
代理和通知中樞都是協調各個對象之間進行訊息通訊,通知中樞在功能上與代理有些類似,二者在選擇時有什麼區分?
代理對應的關係的一對一的關係,而通知是一對多的關係,所以在遇到需要一處改變引起多出
變化的功能上我們最好選擇通知。
例如 :
QQ音樂App上換皮膚效果
讀書軟體改變字型大小效果
在實際開發中合理的使用二者,防止大材小用
一個通知成功實施的必有要三要素
通知發行者
通知中樞
通知接收者
一個完整通知包含三個屬性
name:通知的名稱
object:通知的發行者
userInfo:通知者給通知接收者的資訊內容
通知接收者向通知中樞註冊通知方法
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject; observer:監聽器,即誰要接收這個通知aSelector:收到通知後,回調監聽器的這個方法,並且把通知對象當做參數傳入 aName:通知的名稱。如果為nil,那麼無論通知的名稱是什麼,監聽器都能收到這個通知 anObject:通知發行者。如果為anObject和aName都為nil,監聽器都收到所有的通知
通知中樞發布通知的三種方法
? - (void)postNotification:(NSNotification *)notification;? - (void)postNotificationName:(NSString *)aName object: (id)anObject;? - (void)postNotificationName:(NSString *)aName object:(id)anObjectuserInfo:(NSDictionary *)aUserInfo;
通知下的dealloc方法
我們在通知中樞註冊完後,通知中樞是非常靈敏的,當條件被觸發後就會不斷的向註冊者發送訊息,但當我們的註冊者已經被釋放了,這時候就會造成野指標,引發程式崩潰,所以在我們對象被釋放的時候,應該把該對象向通知中樞註冊的通知釋放掉。
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
另外取消註冊的方法有兩個:
- (void)removeObserver:(id)observer;- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;//第二個多了一個name的參數可以具體到該對象中某個通知
通知中樞的常見的實際應用
1. 裝置旋轉
UIDeviceOrientationDidChangeNotification
2. 鍵盤操作
UIKeyboardWillShowNotification // 鍵盤即將顯示 UIKeyboardDidShowNotification // 鍵盤顯示完畢 UIKeyboardWillHideNotification // 鍵盤即將隱藏 UIKeyboardDidHideNotification // 鍵盤隱藏完畢 UIKeyboardWillChangeFrameNotification // 鍵盤的位置尺寸即將發生改變 UIKeyboardDidChangeFrameNotification // 鍵盤的位置尺寸改變完畢
提醒
通知的正常執行的順序為:接收者在通知中樞註冊通知——>通知者在通知中樞發布通知———>釋放通知中樞的註冊通知。順序出錯將會產生錯誤。