ios 小結系列七 通知機制

2022-09-12 16:48:17 字數 3852 閱讀 4645

一、掌握

(1) 通知的發布

(2) 通知的監聽

(3) 通知的移除

二、基本概念

(1) 通知中心(nsnotificationcenter)

•每乙個應用程式都有乙個通知中心(nsnotificationcenter)例項,專門負責協助不同物件之間的訊息通訊

•任何乙個物件都可以向通知中心發布通知(nsnotification),描述自己在做什麼。其他感興趣的物件(observer)可以申請在某個特定通知發布時(或在某個特定的物件發布通知時)收到這個通知

(2) 通知(nsnotification)

•乙個完整的通知一般包含3個屬性:

- (nsstring *)name; // 通知的名稱

- (id)object; // 通知發布者(是誰要發布通知)

- (nsdictionary *)userinfo; // 一些額外的資訊(通知發布者傳遞給通知接收者的資訊內容)

•初始化乙個通知(nsnotification)物件

+ (instancetype)notificationwithname:(nsstring *)aname object:(id)anobject;

+ (instancetype)notificationwithname:(nsstring *)aname object:(id)anobject userinfo:(nsdictionary *)auserinfo;

- (instancetype)initwithname:(nsstring *)name object:(id)object userinfo:(nsdictionary *)userinfo;

三、發布通知

(1)發布通知

通知中心(nsnotificationcenter)提供了相應的方法來幫助發布通知

•- (void)postnotification:(nsnotification *)notification;

發布乙個notification通知,可在notification物件中設定通知的名稱、通知發布者、額外資訊等

•- (void)postnotificationname:(nsstring *)aname object:(id)anobject;

發布乙個名稱為aname的通知,anobject為這個通知的發布者

•- (void)postnotificationname:(nsstring *)aname object:(id)anobject userinfo:(nsdictionary *)auserinfo;

發布乙個名稱為aname的通知,anobject為這個通知的發布者,auserinfo為額外資訊

四、監聽通知

(1) 註冊通知***

通知中心(nsnotificationcenter)提供了方法來註冊乙個監聽通知的***(observer)

•- (void)addobserver:(id)observer selector:(sel)aselector name:(nsstring *)aname object:(id)anobject;

observer:***,即誰要接收這個通知

aselector:收到通知後,*****的這個方法,並且把通知物件當做引數傳入

aname:通知的名稱。如果為nil,那麼無論通知的名稱是什麼,***都能收到這個通知

anobject:通知發布者。如果為anobject和aname都為nil,***都收到所有的通知

•- (id)addobserverforname:(nsstring *)name object:(id)obj queue:(nsoperationqueue *)queue usingblock:(void (^)(nsnotification *note))block;

name:通知的名稱

obj:通知發布者

block:收到對應的通知時,會**這個block

queue:決定了block在哪個操作佇列中執行,如果傳nil,預設在當前操作佇列中同步執行

(2) 取消註冊通知***

•通知中心不會保留(retain)***物件,在通知中心註冊過的物件,必須在該物件釋放前取消註冊。否則,當相應的通知再次出現時,通知中心仍然會向該***傳送訊息。因為相應的***物件已經被釋放了,所以可能會導致應用崩潰

•通知中心提供了相應的方法來取消註冊***

- (void)removeobserver:(id)observer;

- (void)removeobserver:(id)observer name:(nsstring *)aname object:(id)anobject;

•一般在***銷毀之前取消註冊(如在***中加入下列**):

- (void)dealloc {

//[super dealloc];  非arc中需要呼叫此句

[[nsnotificationcenter defaultcenter] removeobserver:self];

(3) uidevice通知

•uidevice類提供了乙個單粒物件,它代表著裝置,通過它可以獲得一些裝置相關的資訊,比如電池電量值(batterylevel)、電池狀態(batterystate)、裝置的型別(model,比如ipod、iphone等)、裝置的系統(systemversion)

•通過[uidevice currentdevice]可以獲取這個單粒物件

•uidevice物件會不間斷地發布一些通知,下列是uidevice物件所發布通知的名稱常量:

øuideviceorientationdidchangenotification // 裝置旋轉

øuidevicebatterystatedidchangenotification // 電池狀態改變

øuidevicebatteryleveldidchangenotification // 電池電量改變

øuideviceproximitystatedidchangenotification // 近距離感測器(比如裝置貼近了使用者的臉部)

(4) 鍵盤通知

•我們經常需要在鍵盤彈出或者隱藏的時候做一些特定的操作,因此需要監聽鍵盤的狀態

•鍵盤狀態改變的時候,系統會發出一些特定的通知

uikeyboardwillshownotification // 鍵盤即將顯示

uikeyboarddidshownotification // 鍵盤顯示完畢

uikeyboardwillhidenotification // 鍵盤即將隱藏

uikeyboarddidhidenotification // 鍵盤隱藏完畢

uikeyboardwillchangeframenotification // 鍵盤的位置尺寸即將發生改變

uikeyboarddidchangeframenotification // 鍵盤的位置尺寸改變完畢

•系統發出鍵盤通知時,會附帶一下跟鍵盤有關的額外資訊(字典),字典常見的key如下:

uikeyboardframebeginuserinfokey // 鍵盤剛開始的frame

uikeyboardframeenduserinfokey // 鍵盤最終的frame(動畫執行完畢後)

øuikeyboardanimationdurationuserinfokey // 鍵盤動畫的時間

øuikeyboardanimationcurveuserinfokey // 鍵盤動畫的執行節奏(快慢)

(5)通知和**的選擇

•共同點

利用通知和**都能完成物件之間的通訊

(比如a物件告訴d物件發生了什麼事情, a物件傳遞資料給d物件)

•不同點

** : 一對一關係(1個物件只能告訴另1個物件發生了什麼事情)

通知 : 多對多關係(1個物件能告訴n個物件發生了什麼事情, 1個物件能得知n個物件發生了什麼事情)

ios 小結系列二

normal 普通狀態 預設情況 對應的列舉常量 uicontrolstatenormal highlighted 高亮狀態 按鈕被按下去的時候 手指還未鬆開 對應的列舉常量 uicontrolstatehighlighted disabled 失效狀態,不可用狀態 如果enabled屬性為no,就...

PowerDesigner 系列 小結

花了近乙個星期的時間,小研究了一些powerdesigner,現在可以簡單的用用,知道pd 是怎麼一回事了。以前和朋友聊起過我從事dba的經歷,是畢業後上來就搞db了,我和朋友說是運氣好,因為正常情況下,應該是工作幾年,折騰下開發什麼的,然後轉dba,我是走了捷徑,但是開發這塊就丟下了很多東西,還是...

PowerDesigner 系列 小結

花了近乙個星期的時間,小研究了一些powerdesigner,現在可以簡單的用用,知道pd 是怎麼一回事了。以前和朋友聊起過我從事dba的經歷,是畢業後上來就搞db了,我和朋友說是運氣好,因為正常情況下,應該是工作幾年,折騰下開發什麼的,然後轉dba,我是走了捷徑,但是開發這塊就丟下了很多東西,還是...