一、掌握
(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,我是走了捷徑,但是開發這塊就丟下了很多東西,還是...