关于iOS中的通知中心(NSNotificationCenter)

先说一下什么叫通知:
iOS中的通知机制又叫消息机制,其包括2类:一类是本地通知;另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以打开应用程序,但是两种通知的实现原理却完全不同.

那么什么是通知中心呢:
对于初学者,往往会把iOS中的本地通知,推送通知和iOS通知中心的概念弄混.其实二者之间并没有任何关系,事实上它们都不属于一个框架,前者属于UIKit框架,后者属于Foundation框架.

通知中心实际上是iOS程序内部之间的一种消息广播机制,主要为了解决应用程序内部不同对象之间解耦而设计.它是基于观察者模式设计的,不能跨应用程序进程进行通信,当通知中心接收到消息之后会根据内部的消息转发表,将消息发送给订阅者.下面是一个简单的流程示意图:关于iOS中的通知中心(NSNotificationCenter)_第1张图片

通知中心和协议代理等传值有什么区别:
如果我们现在好几个界面又要传递同一个值,也就是说我们当前这个界面都要得到另一个界面给它传值,用代理的话那我们shi’b是不是要把那些界面都要实现本界面都要实现本界面的协议才能取到值?这是效率非常低下的一种做法,要实现数据一对多的情况下,通知中心是一个很好的解决方案.
上图中黄色的线代表addObserver也就是添加观察者,当数据发生改变的时候通过紫色的线也就是postNotification发送通知,当我们的通知中心发送了通知的时候,所有的addObserver都能接收到通知.

了解通知中心需要熟悉NSNotificationCenter和NSNotification两个类:

NSNotificationCenter:是通知系统的中心,用于注册和发送通知,下表列出常用的方法。


方法1
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject
说明:
添加监听,参数:
observer:监听者
selector:监听方法(监听者监听到通知后执行的方法)
name:监听的通知名称
object:通知的发送者(如果指定nil则监听任何对象发送的通知)

方法2
- (id )addObserverForName:(NSString )name object:(id)obj queue:(NSOperationQueue )queue usingBlock:(void (^)(NSNotification *note))block
说明:
添加监听,参数:
name:监听的通知名称
object:通知的发送者(如果指定nil则监听任何对象发送的通知)
queue:操作队列,如果制定非主队线程队列则可以异步执行block
block:监听到通知后执行的操作

方法3
- (void)postNotification:(NSNotification *)notification
说明:
发送通知,参数:
notification:通知对象

方法4
- (void)postNotificationName:(NSString *)aName object:(id)anObject
说明:
发送通知,参数:
aName:通知名称
anObject:通知发送者

方法5
- (void)postNotificationName:(NSString )aName object:(id)anObject userInfo:(NSDictionary )aUserInfo
说明:
发送通知,参数:
aName:通知名称
anObject:通知发送者
aUserInfo:通知参数

方法6
- (void)removeObserver:(id)observer
说明:
移除监听,参数:
observer:监听对象

方法7
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject
说明:
移除监听,参数:
observer:监听对象
aName:通知名称
anObject:通知发送者


NSNotification:代表通知内容的载体,主要有三个属性:name代表通知名称,object代表通知的发送者,userInfo代表通知的附加信息。

通知中心的使用很简单,只需要注册通知和发送通知

1.注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@“myTest” object:nil];

2.发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@“myTest” object:nil userInfo:@{}];

首先我们是在源数据页面发送通知,将需要传递的值写进userInfo中,并给它一个key(后面需要通过这个key取值)

在我们需要取到数值的页面注册通知,我们可以在mytest的实现方法中取值

例如:在源数据页面有这样的代码

[[NSNotificationCenter defaultCenter] postNotificationName:@"categoryDidChanged" object:nil userInfo:@{@"categoryModel":_selectedModel}];

[[NSNotificationCenter defaultCenter] postNotificationName:@"categoryDidChanged" object:nil userInfo:@{@"subCategoryName":subArr[row]}];

其中,_selectedModel和subArr[row]就是我们需要传递的值,发送通知可以发送多次,通过不同的key保存数据

在我们需要取值的控制器的viewDIdLoad中,这样写:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(categoryChange:) name:@"categoryDidChanged" object:nil];

注意:两次的name要一致,然后我们写@selector实现方法

- (void)categoryChange:(NSNotification *)noti{

   CategoriyModel *model =noti.userInfo[@"categoryModel"];
    NSLog(@"%@", model.name);
    NSString *str = noti.userInfo[@"subCategoryName"];
    NSLog(@"%@", str);
}

这里我们注册通知只进行一次,我们可以根据不同的key取得我们之前发送的不同的值,方便快捷

如果我们有不同的name发送的通知,我们也需要注册两次通知,同样的写两个方法,进行两次不同的传值,根据不同的需求我们可以设置多个通知,通知可以全局方便快捷的传值

如果你还有不了解请参考源码,附上链接:
https://github.com/DevinZhan/MyGroupPurchaseProgram_1

你可能感兴趣的:(iOS之OC专题分享)