一、了解幾個相關(guān)的類
1募书、NSNotification
這個類可以理解為一個消息對象绪囱,其中有三個成員變量。
這個成員變量是這個消息對象的唯一標識莹捡,用于辨別消息對象鬼吵。
@property (readonly, copy) NSString *name;
這個成員變量定義一個對象,可以理解為針對某一個對象的消息篮赢。
@property (readonly, retain) id object;
這個成員變量是一個字典齿椅,可以用其來進行傳值。
@property (readonly, copy) NSDictionary *userInfo;
NSNotification的初始化方法:
- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
注意:官方文檔有明確的說明启泣,不可以使用init進行初始化```
2涣脚、**NSNotificationCenter**
這個類是一個通知中心,使用單例設計种远,每個應用程序都會有一個默認的通知中心涩澡。用于調(diào)度通知的發(fā)送的接受。
step1: 添加一個觀察者坠敷,可以為它指定一個方法,名字和對象射富。接受到通知時膝迎,執(zhí)行方法。
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
step2: 發(fā)送通知消息的方法
- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;```
step3: 移除觀察者的方法
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;
幾點注意:
1胰耗、如果發(fā)送的通知指定了object對象限次,那么觀察者接收的通知設置的object對象與其一樣,才會接收到通知柴灯,但是接收通知如果將這個參數(shù)設置為了nil卖漫,則會接收一切通知。
2赠群、觀察者的SEL函數(shù)指針可以有一個參數(shù)羊始,參數(shù)就是發(fā)送的self對象本身,可以通過這個參數(shù)取到消息對象的userInfo查描,實現(xiàn)傳值突委。
二柏卤、通知的使用流程
首先,我們在需要接收通知的地方注冊觀察者匀油,比如:
//獲取通知中心單例對象, 添加當前類對象為一個觀察者缘缚,name為通知名(用來表示唯一的某一個通知)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeBackgroudColor:)name:@"FirstViewControllerChangeBackgroudColor" object:nil];
之后,在我們獲取到數(shù)據(jù)時發(fā)送通知消息
//發(fā)送消息 object參數(shù)為我們要傳遞的參數(shù)
[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewControllerPassValueNotification" object:self userInfo:@{@"passValue":self.textFiled.text}];
實現(xiàn)注冊通知關(guān)聯(lián)的方法
//注意參數(shù)類型
- (void)changeBackgroudColor:(NSNotification*)notification
{
self.view.backgroundColor = notification.object;
#最后一步, 移除通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"FirstViewControllerChangeBackgroudColor" object:nil];
}```