通知中心是一個(gè)單例坪哄。通知在iOS中是一種設(shè)計(jì)模式。每一個(gè)應(yīng)用程序都有一個(gè)通知中心NSNotificationCenter實(shí)例, 專門負(fù)責(zé)協(xié)助不同對(duì)象之間的消息通信.
任何一個(gè)對(duì)象都可以向通知中心發(fā)布NSNotification, 描述自己在做什么势篡,而任何注冊了該通知的對(duì)象該特定通知發(fā)布的時(shí)候會(huì)收到這個(gè)通知翩肌。
獲取通知中心對(duì)象
通過下面的方式來獲取通知中心對(duì)象:
3NSNotificationCenter*center=[NSNotificationCenterdefaultCenter];
通知對(duì)象主要屬性
一個(gè)完整通知,也就是NSNotification對(duì)象殊霞,有下面這三個(gè)主要的屬性:
@property(readonly,copy)NSString*name;
@property(nullable,readonly,retain)idobject;
@property(nullable,readonly,copy)NSDictionary*userInfo;
其中摧阅,第一個(gè)就是通知的名稱,第二個(gè)是通知發(fā)布者绷蹲,而第三個(gè)就是一些額外的信息。比如第三個(gè)可以存儲(chǔ)一些數(shù)據(jù)顾孽,這樣接收者就可以接收到這些數(shù)據(jù)了祝钢。
通知對(duì)象初始化方法
初始化一個(gè)通知對(duì)象,有這幾個(gè)方法:
-(instancetype)initWithName:(NSString*)name
object:(nullableid)object
userInfo:(nullableNSDictionary*)userInfo;
+(instancetype)notificationWithName:(NSString*)aName
object:(nullableid)anObject;
+(instancetype)notificationWithName:(NSString*)aName
object:(nullableid)anObject
userInfo:(nullableNSDictionary*)aUserInfo;
蘋果還提供了一個(gè)初始化方法若厚,但是蘋果要求不能使用:
/* do not invoke; not a valid initializer for this class */
-(instancetype)init/*NS_UNAVAILABLE*/;
發(fā)布通知
通知的發(fā)布拦英,需要通過通知中心NSNotificationCenter來發(fā)布。發(fā)布通知中幾個(gè)三個(gè)方法:
-(void)postNotification:(NSNotification*)notification;
-(void)postNotificationName:(NSString*)aName
object:(nullableid)anObject;
-(void)postNotificationName:(NSString*)aName
object:(nullableid)anObject
userInfo:(nullableNSDictionary*)aUserInfo;
第一個(gè)方法直接將一個(gè)通知對(duì)象發(fā)布出去测秸,這種方法使用場景極少疤估,幾乎沒有見到使用的
第二個(gè)方法是根據(jù)通知的名稱,發(fā)布通知的對(duì)象霎冯,將通知發(fā)布出去铃拇。當(dāng)不需要傳遞參數(shù)時(shí),這種方法使用場景比較多
第三個(gè)方法與第二個(gè)方法就差一個(gè)參數(shù)沈撞,而第三方方法主要是可以發(fā)布通知的同時(shí)傳遞一些額外的信息
注冊通知
要想能夠接收到通知慷荔,就得提前注冊通知到通知中心,否則不會(huì)接收到缠俺。蘋果提供了兩個(gè)注冊通知的方法:
-(void)addObserver:(id)observer
selector:(SEL)aSelector
name:(nullableNSString*)aName
object:(nullableid)anObject;
-(id)addObserverForName:(nullableNSString*)name
object:(nullableid)obj
queue:(nullableNSOperationQueue*)queue
usingBlock:(void(^)(NSNotification*note))block
第一個(gè)方法使用的方式是最多的显晶,第二個(gè)方法很少見到使用贷岸。第二個(gè)方法是支持block回調(diào)的,而queue參數(shù)就是在哪個(gè)隊(duì)列磷雇。
取消注冊通知
通知注冊了偿警,在不需要時(shí)還需要移除注冊。通知中心不會(huì)保留監(jiān)聽器對(duì)象, 在通知中心注冊過的對(duì)象,必須在該對(duì)象釋放前取消注冊. 否則,當(dāng)相應(yīng)的通知再次出現(xiàn)時(shí), 通知中心仍然會(huì)向該監(jiān)聽器發(fā)送消息. 因?yàn)? 相應(yīng)的監(jiān)聽器對(duì)象已經(jīng)被釋放了, 所以可能會(huì)導(dǎo)致應(yīng)用崩潰唯笙,這種崩潰很常見螟蒸。
蘋果提供了兩個(gè)方法,可以移除注冊:
-(void)removeObserver:(id)observer;
-(void)removeObserver:(id)observer
name:(nullableNSString*)aName
object:(nullableid)anObject;
通常睁本,我們會(huì)在控制器的dealloc之前尿庐,先取消注冊通知:
-(void)dealloc{
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
如果我們只是想取消某一個(gè)通知的注冊,而不是全部呢堰,那么可以使用第二個(gè)方法抄瑟,將通知名稱傳過去,就會(huì)只取消注冊該通知枉疼。
鍵盤通知
對(duì)于鍵盤皮假,我們經(jīng)常需要注冊與移除注冊通知:
UIKeyboardWillShowNotification// 鍵盤即將顯示
UIKeyboardDidShowNotification// 鍵盤顯示完畢
UIKeyboardWillHideNotification// 鍵盤即將隱藏
UIKeyboardDidHideNotification// 鍵盤隱藏完畢
UIKeyboardWillChangeFrameNotification// 鍵盤的位置尺寸即將發(fā)生改變
UIKeyboardDidChangeFrameNotification// 鍵盤的位置尺寸改變完畢