通知

1.一個完整的通知一般包含3個屬性:

- (NSString *)name; // 通知的名稱
- (id)object; // 通知發(fā)布者(是誰要發(fā)布通知)
- (NSDictionary *)userInfo; // 一些額外的信息(通知發(fā)布者傳遞給通知接收者的信息內(nèi)容)

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

3.發(fā)布通知

- (void)postNotification:(NSNotification *)notification;
發(fā)布一個notification通知花枫,可在notification對象中設(shè)置通知的名稱考廉、通知發(fā)布者、額外信息等

- (void)postNotificationName:(NSString *)aName object:(id)anObject;
發(fā)布一個名稱為aName的通知杆查,anObject為這個通知的發(fā)布者

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
發(fā)布一個名稱為aName的通知搂抒,anObject為這個通知的發(fā)布者艇搀,aUserInfo為額外信息

4.注冊通知監(jiān)聽器

通知中心(NSNotificationCenter)提供了方法來注冊一個監(jiān)聽通知的監(jiān)聽器(Observer)
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
observer:監(jiān)聽器,即誰要接收這個通知
aSelector:收到通知后求晶,回調(diào)監(jiān)聽器的這個方法焰雕,并且把通知對象當做參數(shù)傳入
aName:通知的名稱。如果為nil芳杏,那么無論通知的名稱是什么矩屁,監(jiān)聽器都能收到這個通知
anObject:通知發(fā)布者。如果為anObject和aName都為nil蚜锨,監(jiān)聽器都收到所有的通知
- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;
name:通知的名稱
obj:通知發(fā)布者
block:收到對應(yīng)的通知時档插,會回調(diào)這個block
queue:決定了block在哪個操作隊列中執(zhí)行,如果傳nil亚再,默認在當前操作隊列中同步執(zhí)行

5.取消注冊通知監(jiān)聽器
通知中心不會保留(retain)監(jiān)聽器對象郭膛,在通知中心注冊過的對象,必須在該對象釋放前取消注冊氛悬。否則则剃,當相應(yīng)的通知再次出現(xiàn)時耘柱,通知中心仍然會向該監(jiān)聽器發(fā)送消息。因為相應(yīng)的監(jiān)聽器對象已經(jīng)被釋放了棍现,所以可能會導(dǎo)致應(yīng)用崩潰
通知中心提供了相應(yīng)的方法來取消注冊監(jiān)聽器

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

一般在監(jiān)聽器銷毀之前取消注冊(如在監(jiān)聽器中加入下列代碼):

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

6.UIDevice通知
UIDevice類提供了一個單粒對象调煎,它代表著設(shè)備,通過它可以獲得一些設(shè)備相關(guān)的信息己肮,比如電池電量值(batteryLevel)士袄、電池狀態(tài)(batteryState)、設(shè)備的類型(model谎僻,比如iPod娄柳、iPhone等)、設(shè)備的系統(tǒng)(systemVersion)

通過[UIDevice currentDevice]可以獲取這個單粒對象

UIDevice對象會不間斷地發(fā)布一些通知艘绍,下列是UIDevice對象所發(fā)布通知的名稱常量:

UIDeviceOrientationDidChangeNotification // 設(shè)備旋轉(zhuǎn)
UIDeviceBatteryStateDidChangeNotification // 電池狀態(tài)改變
UIDeviceBatteryLevelDidChangeNotification // 電池電量改變
UIDeviceProximityStateDidChangeNotification // 近距離傳感器(比如設(shè)備貼近了使用者的臉部)

7.鍵盤通知
我們經(jīng)常需要在鍵盤彈出或者隱藏的時候做一些特定的操作,因此需要監(jiān)聽鍵盤的狀態(tài)
鍵盤狀態(tài)改變的時候,系統(tǒng)會發(fā)出一些特定的通知

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

系統(tǒng)發(fā)出鍵盤通知時,會附帶一下跟鍵盤有關(guān)的額外信息(字典),字典常見的key如下:

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

8.通知和和代理的區(qū)別
共同點
利用通知和代理都能完成對象之間的通信
(比如A對象告訴D對象發(fā)生了什么事情, A對象傳遞數(shù)據(jù)給D對象)

不同點
代理 : 1個對象只能告訴另1個對象發(fā)生了什么事情
通知 : 1個對象能告訴N個對象發(fā)生了什么事情, 1個對象能得知N個對象發(fā)生了什么事情
9.通知的三種方式
(1)不傳遞參數(shù), 最常用的一種

// 發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"noti1" object:nil];

//監(jiān)聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noti1) name:@"noti1" object:nil];

//調(diào)用方法
-(void)noti1
{
NSLog(@"接收 不帶參數(shù)的消息");
}

(2)使用object 傳遞消息

//發(fā)通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"noti2" object:[NSString stringWithFormat:@"%@",btn.titleLabel.text]];

//監(jiān)聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noti2:) name:@"noti2" object:nil];

//調(diào)用方法
-(void)noti2:(NSNotification *)noti
{
//使用object處理消息
NSString *info = [noti object];
NSLog(@"接收 object傳遞的消息:%@",info);
}

(3)使用userInfo 傳遞消息

//發(fā)通知
NSDictionary *dic = [NSDictionary dictionaryWithObject:@"userInfo消息" forKey:@"param"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"noti3" object:nil userInfo:dic];

//監(jiān)聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noti3:) name:@"noti3" object:nil];

//調(diào)用方法
-(void)noti3:(NSNotification *)noti
{
//使用userInfo處理消息
NSDictionary  *dic = [noti userInfo];
NSString *info = [dic objectForKey:@"param"];
NSLog(@"接收 userInfo傳遞的消息:%@",info);
}

最后赤拒,記得在發(fā)送通知消息的頁面,在dealloc方法里面移除觀察者诱鞠。

-(void)dealloc

{

//移除觀察者挎挖,Observer不能為nil

[[NSNotificationCenter defaultCenter] removeObserver:self];

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市航夺,隨后出現(xiàn)的幾起案子蕉朵,更是在濱河造成了極大的恐慌,老刑警劉巖敷存,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓造,死亡現(xiàn)場離奇詭異,居然都是意外死亡锚烦,警方通過查閱死者的電腦和手機觅闽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涮俄,“玉大人蛉拙,你說我怎么就攤上這事〕骨祝” “怎么了孕锄?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苞尝。 經(jīng)常有香客問我畸肆,道長,這世上最難降的妖魔是什么宙址? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任轴脐,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘大咱。我一直安慰自己恬涧,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布碴巾。 她就那樣靜靜地躺著溯捆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厦瓢。 梳的紋絲不亂的頭發(fā)上提揍,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音旷痕,去河邊找鬼碳锈。 笑死,一個胖子當著我的面吹牛欺抗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播强重,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼绞呈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了间景?” 一聲冷哼從身側(cè)響起佃声,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倘要,沒想到半個月后圾亏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡封拧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年志鹃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泽西。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡曹铃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捧杉,到底是詐尸還是另有隱情陕见,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布味抖,位于F島的核電站评甜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仔涩。R本人自食惡果不足惜忍坷,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧承匣,春花似錦蓖乘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袍暴,卻和暖如春些侍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背政模。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工岗宣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淋样。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓耗式,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趁猴。 傳聞我的和親對象是個殘疾皇子刊咳,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容