(转载)OC学习篇之---通知(NSNotificationCenter)

在前一篇文章中我们介绍了OC中很常用的两个技术:KVC和KVO,今天我们来看一下OC中另外的一个常用技术:通知(Nofitication)

其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Android中系统发送的广播,我们只能接受。但是通知就不一样了,他的监听发送也是又我们自己控制,我们可以在任何地方任何时机发送一个通知,类似于Android中开发者自己发送的广播。从这一点看来,通知的使用场景更为广泛了。

下面就来看一下例子:

还是护士和小孩的那个例子

Children.h

 1 //
 2 //  Children.h
 3 //  44_KVO
 4 //
 5 //  Created by jiangwei on 14-10-16.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface Children : NSObject
12
13 @property NSInteger *hapyValue;
14
15
16 @end

定义了一个属性:hapyValue

Children.m

 1 //
 2 //  Children.m
 3 //  44_KVO
 4 //
 5 //  Created by jiangwei on 14-10-16.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import "Children.h"
10
11 @implementation Children
12
13 - (id) init{
14     self = [super init];
15     if(self != nil){
16         //启动定时器
17         [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
18         self.hapyValue= 100;
19     }
20     return self;
21 }
22
23 - (void) timerAction:(NSTimer *) timer{
24     //使用set方法修改属性值,才能触发KVO
25     _hapyValue--;
26     NSLog(@"%@",_hapyValue);
27     if(_hapyValue <80){
28         //发送通知
29         //这里和KVO的区别,我们可以手动的发送通知
30         //注意通知的名称,传递的参数必须和定义通知的地方的参数值要一致
31         //将Children对象传递过去
32         [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];
33     }
34
35 }
36
37
38 @end

定义了一个定时器,但是我们看到这里的timerAction方法中就开始发送一个通知了:

1 //发送通知
2 //这里和KVO的区别,我们可以手动的发送通知
3 //注意通知的名称,传递的参数必须和定义通知的地方的参数值要一致
4 //将Children对象传递过去
5 [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];  

我们在属性值发生变化的地方发送一个通知:NSNotificationCenter

第一个参数:通知的名称,这个名称必须和后面接受通知的名称一致

第二个参数:可以传递的一个参数对象

Nure.h

 1 //
 2 //  Nure.h
 3 //  44_KVO
 4 //
 5 //  Created by jiangwei on 14-10-16.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface Nure : NSObject
12
13 @end

Nure.m

 1 //
 2 //  Nure.m
 3 //  44_KVO
 4 //
 5 //  Created by jiangwei on 14-10-16.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import "Nure.h"
10 #import "Children.h"
11
12 @implementation Nure
13
14 - (id) init{
15     self = [super init];
16     if(self != nil){
17
18         //监听一个通知,当收到通知时,调用notificationAction方法
19         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];
20
21     }
22     return self;
23 }
24
25
26 - (void) notificationAction:(NSNotification *)notification{
27     //这里我们拿到Children对象进行操作
28     Children *children = notification.object;
29     NSLog(@"触发通知");
30 }
31
32 - (void)dealloc{
33     //移除指定的通知,不然会造成内存泄露
34     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];
35
36     //Children对象可以添加多个通知
37     //下面的方法是可以移除Children中所有通知
38     [[NSNotificationCenter defaultCenter] removeObserver:self];
39 }
40
41 @end

在Nure类中我们开始接受通知了:

1 //监听一个通知,当收到通知时,调用notificationAction方法
2 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];  

使用addObserver方法来监听通知:

第一个参数:监听者对象

第二个参数:监听处理逻辑的方法

第三个参数:通知的名称

第四个参数:通知发送的时候传递过来的参数对象

1、处理通知的方法

1 - (void) notificationAction:(NSNotification *)notification{
2     //这里我们拿到Children对象进行操作
3     Children *children = notification.object;
4     NSLog(@"触发通知");
5 }  

这里会传递一个NSNotification对象,通过object属性可以获取到监听对象了,因为我们在发送通知的时候传递过来的这个对象。那么这里我们就可以获取监听对象的属性值了,但是这里我们如果想知道属性值变化前和变化后的值,我们可以在Children类中在定义一个属性专门用来记录旧的属性值,这样就可以了。

2、销毁方法

1 - (void)dealloc{
2     //移除指定的通知,不然会造成内存泄露
3     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];
4
5     [[NSNotificationCenter defaultCenter] removeObserver:self];
6 }  

在销毁的方法中,我们可以需要移除监听者,传递过去通知名

但是这里我们会注意到,还有一个方法:removeObserver方法,是用来移除所有监听者的,因为可能有多个监听者。

总结

OC中KVO操作和通知都是很重要的一个操作,他们的原理是基于观察者模式的,但是KVO操作没有通知灵活。但是KVO也有自己的优点,比如可以记录新旧值,这个通知就比较麻烦点了,所以我们在使用的时候视情况而定,一般监听属性值变化的我们还是使用KVO.

时间: 2024-10-17 17:11:14

(转载)OC学习篇之---通知(NSNotificationCenter)的相关文章

OC学习篇之---总结和学习目录

今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 1.OC学习篇之---概述 2.OC学习篇之---第一个程序HelloWorld 3.OC学习篇之---类的定义 4.OC学习篇之---类的初始化方法和点语法的使用 5.OC学习篇之---类的三大特性(封装,继承,多态) 6.OC学习篇之[email protected]关键

(转载)OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性,今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了 二.关键字@class的作用 在来看一下OC中的关键字@class的作用,在

(转载)OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,让初始化操作只执行一次 2.类提供一个类方法产生对象 这个可以直接定义一个类方法 3.类中有一个私有的自己对象 我们可以在.m文件

OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,

OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入

(转载)OC学习篇之---概述

前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲了,当然我们知道,Android是Java语言支撑的,iOS是OC支撑的,关于OC的学习,会和Java相对比这来,这样效率也会高点,同时在大学里学了C/C++所以,学习OC就没什么难度了,就是一套新的api. 概述 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会

OC学习篇之---概述

前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲了,当然我们知道,Android是Java语言支撑的,iOS是OC支撑的,关于OC的学习,会和Java相对比这来,这样效率也会高点,同时在大学里学了C/C++所以,学习OC就没什么难度了,就是一套新的api. 概述 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会

(转载)OC学习篇之---类的三大特性:封装,继承,多态

之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义类的时

(转载)OC学习篇之---谓词(NSPredicate)

在前一篇文章中我们介绍了OC中一个重要技术通知,今天我们在来看一下OC中给我们提供的一个技术:谓词(NSPredicate) OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据.非常方便.在Java中是没有这种技术的,但是有开源的框架已经实现了此功能. 下面来看一下具体的例子吧: Person.h 1 // 2 // Person.