iOS中的通知機制

iOS中的通知

通知中心(NSNotificationCenter)

    每個應用程序都有一個通知中心(NSNotificationCenter)實例, 專門負責協助不一樣對象之間的消息通訊.ide

    任何一個對象均可以向通知中心發佈通知(NSNotification), 描述本身在作什麼. 其餘感興趣的對象(Observe)能夠申請在某個特定通知發佈的時候(或在某個特定對象發佈通知時)收到這個通知.post

通知(NSNotification)動畫

    一個完整的通知通常包含三個屬性:spa

-(NSString *)name; // 通知的名稱
-(id)object        // 通知發佈者
-(NSDictionary *) userInfo ; // 一些額外的信息(通知發佈者傳遞給通hi接收者的信息內容).

    初始化一個通知(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;

發佈通知

    通知中心(NSNotificationCenter)提供了相應的方法來幫助發佈通知.
code

- (void)postNotification:(NSNotification *)notification;

    發佈一個notification通知,可在notification對象中設置通知的名稱, 通知發佈者, 額外信息等.
server

- (void)postNotificationName:(NSString *)aName object:(id)anObject;

    發佈一個名稱爲aName的通知, anObject爲這個通知的發佈者.
對象

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

    發佈一個名稱爲aName的通知, anObject爲這個通知的發佈者, aUserInfo爲額外信息.
隊列

註冊通知監聽器

    通知中心(NSNotificationCenter)提供了方法來註冊一個監聽通知的監聽器(Observe).
rem

- (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 ,默認在當前操做隊列中同步執行 .

取消註冊通知監聽器

    通知中心不會保留(retain)監聽器對象, 在通知中心註冊過的對象 ,必須在該對象釋放前取消註冊. 不然, 當相應的通知再次出現時, 通知中心仍然會向該監聽器發送消息. 由於, 相應的監聽器對象已經被釋放了, 因此可能會致使應用崩潰 . 

    通知中心提供了相應的方法來取消註冊監聽器

- (void)removeObserver:(id)observer; 
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

    通常在監聽器銷燬以前取消註冊(如在監聽器中加入下列代碼) :

- (void)dealloc {
  //[super dealloc];  非ARC中須要調用此句
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

UIDevice通知

    UIDevice類提供了一個單例對象, 它表明着設備, 經過它能夠得到一些設備相關的信息, 好比電池電量值(batteryLevel), 電池狀態(batteryState), 設備的類型(model ,好比iPad, iPhone等), 設備的系統(systemVersion).

    經過[UIDevice currentDevice]能夠獲取這個單例對象 ;

    UIDevice對象會不間斷地發佈一些通知, 下列是UIDevice對象所發佈通知的名稱常量:

UIDeviceOrientationDidChangeNotification    // 設備旋轉 
UIDeviceBatteryStateDidChangeNotification   // 電池狀態改變 
UIDeviceBatteryLevelDidChangeNotification   // 電池電量改變 
UIDeviceProximityStateDidChangeNotification // 近距離傳感器(好比設備貼近了使用者的臉部)

鍵盤通知

    咱們常常須要在鍵盤彈出或者隱藏的時候作一些特定的操做, 所以須要監聽鍵盤的狀態 .

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

UIKeyboardWillShowNotification // 鍵盤即將顯示 
UIKeyboardDidShowNotification // 鍵盤顯示完畢 
UIKeyboardWillHideNotification // 鍵盤即將隱藏 
UIKeyboardDidHideNotification // 鍵盤隱藏完畢 
UIKeyboardWillChangeFrameNotification // 鍵盤的位置尺寸即將發生改變 
UIKeyboardDidChangeFrameNotification // 鍵盤的位置尺寸改變完畢

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

UIKeyboardFrameBeginUserInfoKey // 鍵盤剛開始的frame 
UIKeyboardFrameEndUserInfoKey // 鍵盤最終的frame(動畫執行完畢後) 
UIKeyboardAnimationDurationUserInfoKey // 鍵盤動畫的時間 
UIKeyboardAnimationCurveUserInfoKey // 鍵盤動畫的執行節奏(快慢)

通知和代理的選擇

共同點:

    利用通知和代理都能完成對象之間的通訊.

不一樣點:

    代理: 一對一關係(一個對象只能告訴另外一個對象發生了什麼事情).

    通知: 多對多關係(一個對象能告訴N個對象發生了什麼事情, 一個對象能得知N個對象發生了什麼事情).

相關文章
相關標籤/搜索