通知 是在跳轉控制器之間常用的傳值代理方式纹冤,除了代理模式洒宝,通知更方便、便捷萌京,一個簡單的Demo實現(xiàn)通知的跳轉傳值.
一:創(chuàng)建通知(NSNotification)
-??初始化一個通知(NSNotification)對象
@interface NSNotification (NSNotificationCreation)
+ (instancetype)notificationWithName:(NSNotificationName)aName object:(nullable id)anObject;
+ (instancetype)notificationWithName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
- (instancetype)init /*NS_UNAVAILABLE*/; /* do not invoke; not a valid initializer for this class */
@end
/* 創(chuàng)建通知的理解
NSNotification作為一種消息傳遞的媒介,
包含三個public成員變量雁歌,
通過NSNotificationName類型的name來查找對應observer,
并且可以在object和userInfo中傳入?yún)?shù)知残。
可以使用上述的幾種初始化方式進行初始化靠瞎。
*/
-??一個完整的通知一般包含3個屬性:
- (NSString*)name;//通知的名稱
- (id)object;//通知發(fā)布者(是誰要發(fā)布通知)
- (NSDictionary*)userInfo;//一些額外的信息(通知發(fā)布者傳遞給通知接收者的信息內容)
二: 在通知中心添加觀察者
??通知中心(NSNotificationCenter)提供了方法來注冊一個監(jiān)聽通知的監(jiān)聽器(Observer)
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
//observer:監(jiān)聽器,即誰要接收這個通知
//aSelector:收到通知后橡庞,回調監(jiān)聽器的這個方法较坛,并且把通知對象當做參數(shù)傳入
//aName:通知的名稱。如果為nil扒最,那么無論通知的名稱是什么丑勤,監(jiān)聽器都能收到這個通知
//anObject:通知發(fā)布者。如果為anObject和aName都為nil吧趣,監(jiān)聽器都收到所有的通知
三: 發(fā)布通知
??通知中心(NSNotificationCenter)提供了相應的方法來幫助發(fā)布通知
- (void)postNotification:(NSNotification *)notification;
//發(fā)布一個notification通知法竞,可在notification對象中設置通知的名稱、通知發(fā)布者强挫、額外信息等
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
//發(fā)布一個名稱為aName的通知岔霸,anObject為這個通知的發(fā)布者
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
//發(fā)布一個名稱為aName的通知,anObject為這個通知的發(fā)布者俯渤,aUserInfo為額外信息
.
四 移除觀察者
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject;
// iOS4以后呆细,以block的形式代替selector方式為通知中心添加觀察者
- (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);
五 通知中心:(NSNotificationCenter)
- 每一個應用程序都有一個通知中心(NSNotificationCenter)實例,專門負責協(xié)助不同對象之間的消息通信
- 任何一個對象都可以向通知中心發(fā)布通知(NSNotification)八匠,描述自己在做什么絮爷。其他感興趣的對象(Observer)可以申請在某個特定通知發(fā)布時(或在某個特定的對象發(fā)布通知時)收到這個通知
??舉例
?舉個例子??:在發(fā)送通知后,在所要接收的控制器中注冊通知監(jiān)聽者梨树,將通知發(fā)送的信息接收
//發(fā)送通知方法
- (void)postNotification{
//添加字典
NSDictionary *dict =[[NSDictionary alloc]initWithObjectsAndKeys:self.textFieldOne.text,@"textOne",self.textFieldTwo.text,@"textTwo",nil];
//創(chuàng)建通知 用來傳送字典數(shù)據(jù)
NSNotification *notification=[NSNotification notificationWithName:@"tongzhi"object:niluserInfo:dict];
//發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
}
- (void)viewDidLoad{
[superviewDidLoad];
//添加通知觀察者 監(jiān)聽通知
[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(tongzhi:)name:@"tongzhi"object:nil];
}
//接收到通知
- (void)tongzhi:(NSNotification*)notification{
NSLog(@"%@", notification.userInfo);
NSLog(@"-----接收到通知------");
//notification.object通知的發(fā)布者
//notification.userInfo發(fā)送者給接受者發(fā)送的信息
//notification.name通知的名稱
}
- (void)dealloc {
//移除通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}
移除通知:removeObserver:和removeObserver:name:object:
其中坑夯,removeObserver:是刪除通知中心保存的調度表一個觀察者的所有入口,而removeObserver:name:object:是刪除匹配了通知中心保存的調度表中觀察者的一個入口抡四。
這個比較簡單柜蜈,直接調用該方法就行。例如:
[[NSNotificationCenter defaultCenter] removeObserver:observername:nil object:self];
注意參數(shù)notificationObserver為要刪除的觀察者指巡,一定不能置為nil淑履。
????補充: 通知和代理的區(qū)別1、相同點
代理和通知都能完成對象之間的通信(A對象告訴B對象發(fā)生了什么,A對象傳遞數(shù)
據(jù)給B對象)2藻雪、不同點
代理:1對1(1個對象,只能告訴另一個對象發(fā)生了什么)
通知:多對多(1個對象可以通知多個對象,1個對象可以訂閱多個對象發(fā)布的通
知)
參考網址1:http://www.reibang.com/p/356f7af4f2ee
參考網址2:http://blog.sina.com.cn/s/blog_6317728d0102v779.html