通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便、便捷,一个简单的Demo实现通知的跳转传值.
一:创建通知(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
/* 创建通知的理解
NSNotification作为一种消息传递的媒介,
包含三个public成员变量,
通过NSNotificationName类型的name来查找对应observer,
并且可以在object和userInfo中传入参数。
可以使用上述的几种初始化方式进行初始化。
*/
-👨一个完整的通知一般包含3个属性:
- (NSString*)name;//通知的名称
- (id)object;//通知发布者(是谁要发布通知)
- (NSDictionary*)userInfo;//一些额外的信息(通知发布者传递给通知接收者的信息内容)
二: 在通知中心添加观察者
🌰通知中心(NSNotificationCenter)提供了方法来注册一个监听通知的监听器(Observer)
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
//observer:监听器,即谁要接收这个通知
//aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入
//aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知
//anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知
三: 发布通知
🍊通知中心(NSNotificationCenter)提供了相应的方法来帮助发布通知
- (void)postNotification:(NSNotification *)notification;
//发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
//发布一个名称为aName的通知,anObject为这个通知的发布者
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
//发布一个名称为aName的通知,anObject为这个通知的发布者,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)实例,专门负责协助不同对象之间的消息通信
- 任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知
🌰举例
举个例子🌰:在发送通知后,在所要接收的控制器中注册通知监听者,将通知发送的信息接收
//发送通知方法
- (void)postNotification{
//添加字典
NSDictionary *dict =[[NSDictionary alloc]initWithObjectsAndKeys:self.textFieldOne.text,@"textOne",self.textFieldTwo.text,@"textTwo",nil];
//创建通知 用来传送字典数据
NSNotification *notification=[NSNotification notificationWithName:@"tongzhi"object:niluserInfo:dict];
//发送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
}
- (void)viewDidLoad{
[superviewDidLoad];
//添加通知观察者 监听通知
[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(tongzhi:)name:@"tongzhi"object:nil];
}
//接收到通知
- (void)tongzhi:(NSNotification*)notification{
NSLog(@"%@", notification.userInfo);
NSLog(@"-----接收到通知------");
//notification.object通知的发布者
//notification.userInfo发送者给接受者发送的信息
//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];
注意参数notificationObserver为要删除的观察者,一定不能置为nil。
🌲🌲补充: 通知和代理的区别1、相同点
代理和通知都能完成对象之间的通信(A对象告诉B对象发生了什么,A对象传递数
据给B对象)2、不同点
代理:1对1(1个对象,只能告诉另一个对象发生了什么)
通知:多对多(1个对象可以通知多个对象,1个对象可以订阅多个对象发布的通
知)
参考网址1:https://www.jianshu.com/p/356f7af4f2ee
参考网址2:http://blog.sina.com.cn/s/blog_6317728d0102v779.html