OC学习篇之---通知(NSNotificationCenter)
在前一篇文章中我们介绍了OC中很常用的两个技术:KVC和KVO: http://blog.csdn.net/jiangwei0910410003/article/details/41912937,今天我们来看一下OC中另外的一个常用技术:通知(Nofitication)
其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Android中系统发送的广播,我们只能接受。但是通知就不一样了,他的监听发送也是又我们自己控制,我们可以在任何地方任何时机发送一个通知,类似于Android中开发者自己发送的广播。从这一点看来,通知的使用场景更为广泛了。
下面就来看一下例子:
还是护士和小孩的那个例子
Children.h
- //
- // Children.h
- // 44_KVO
- //
- // Created by jiangwei on 14-10-16.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Children : NSObject
- @property NSInteger *hapyValue;
- @end
定义了一个属性:hapyValue
Children.m
- //
- // Children.m
- // 44_KVO
- //
- // Created by jiangwei on 14-10-16.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import "Children.h"
- @implementation Children
- - (id) init{
- self = [super init];
- if(self != nil){
- //启动定时器
- [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
- self.hapyValue= 100;
- }
- return self;
- }
- - (void) timerAction:(NSTimer *) timer{
- //使用set方法修改属性值,才能触发KVO
- _hapyValue--;
- NSLog(@"%@",_hapyValue);
- if(_hapyValue <80){
- //发送通知
- //这里和KVO的区别,我们可以手动的发送通知
- //注意通知的名称,传递的参数必须和定义通知的地方的参数值要一致
- //将Children对象传递过去
- [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];
- }
- }
- @end
定义了一个定时器,但是我们看到这里的timerAction方法中就开始发送一个通知了:
- //发送通知
- //这里和KVO的区别,我们可以手动的发送通知
- //注意通知的名称,传递的参数必须和定义通知的地方的参数值要一致
- //将Children对象传递过去
- [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];
我们在属性值发生变化的地方发送一个通知:NSNotificationCenter
第一个参数:通知的名称,这个名称必须和后面接受通知的名称一致
第二个参数:可以传递的一个参数对象
Nure.h
- //
- // Nure.h
- // 44_KVO
- //
- // Created by jiangwei on 14-10-16.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Nure : NSObject
- @end
Nure.m
- //
- // Nure.m
- // 44_KVO
- //
- // Created by jiangwei on 14-10-16.
- // Copyright (c) 2014年 jiangwei. All rights reserved.
- //
- #import "Nure.h"
- #import "Children.h"
- @implementation Nure
- - (id) init{
- self = [super init];
- if(self != nil){
- //监听一个通知,当收到通知时,调用notificationAction方法
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];
- }
- return self;
- }
- - (void) notificationAction:(NSNotification *)notification{
- //这里我们拿到Children对象进行操作
- Children *children = notification.object;
- NSLog(@"触发通知");
- }
- - (void)dealloc{
- //移除指定的通知,不然会造成内存泄露
- [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];
- //Children对象可以添加多个通知
- //下面的方法是可以移除Children中所有通知
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- @end
在Nure类中我们开始接受通知了:
- //监听一个通知,当收到通知时,调用notificationAction方法
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];
使用addObserver方法来监听通知
第一个参数:监听者对象
第二个参数:监听处理逻辑的方法
第三个参数:通知的名称
第四个参数:通知发送的时候传递过来的参数对象
1、处理通知的方法
- - (void) notificationAction:(NSNotification *)notification{
- //这里我们拿到Children对象进行操作
- Children *children = notification.object;
- NSLog(@"触发通知");
- }
这里会传递一个NSNotification对象,通过object属性可以获取到监听对象了,因为我们在发送通知的时候传递过来的这个对象。那么这里我们就可以获取监听对象的属性值了,但是这里我们如果想知道属性值变化前和变化后的值,我们可以在Children类中在定义一个属性专门用来记录旧的属性值,这样就可以了。
2、销毁方法
- - (void)dealloc{
- //移除指定的通知,不然会造成内存泄露
- [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
在销毁的方法中,我们可以需要移除监听者,传递过去通知名
但是这里我们会注意到,还有一个方法:removeObserver方法,是用来移除所有监听者的,因为可能有多个监听者。
总结
OC中KVO操作和通知都是很重要的一个操作,他们的原理是基于观察者模式的,但是KVO操作没有通知灵活。但是KVO也有自己的优点,比如可以记录新旧值,这个通知就比较麻烦点了,所以我们在使用的时候视情况而定,一般监听属性值变化的我们还是使用KVO.
OC学习篇之---通知(NSNotificationCenter)的更多相关文章
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
- OC学习篇之---单例模式
在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...
- (转载)OC学习篇之---概述
前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- (转载)OC学习篇之---第一个程序HelloWorld
之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...
- OC学习篇之---第一个程序HelloWorld
从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这里最好还是Java).在干活之前,得先找到 ...
- OC学习篇之---谓词(NSPredicate)
在前一篇文章中我们介绍了OC中一个重要技术通知:http://blog.csdn.net/jiangwei0910410003/article/details/41923401,今天我们在来看一下OC ...
- OC学习篇之---类的三大特性(封装,继承,多态)
之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...
- (转载)OC学习篇之---归档和解挡
前几篇文章说到了OC中的Foundation框架,今天我们来看一下OC中的一个重要知识点:归档 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOu ...
随机推荐
- sql语句:union
sql语句中,join,left join中,是将两个或多个表横向连接,而有时,我们需要将几个表或1个表纵向连接,甚至是连接自身,就比如,某些数据库脚本特别不合理的时候,但我们又不能说啥 ....郁 ...
- QR分解
从矩阵分解的角度来看,LU和Cholesky分解目标在于将矩阵转化为三角矩阵的乘积,所以在LAPACK种对应的名称是trf(Triangular Factorization).QR分解的目的在 ...
- UVA 11389 The Bus Driver Problem
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82842#problem/D In a city there are n bus ...
- HDU_1430——魔板,预处理,康托展开,置换,string类的+操作
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
- Mysql 5.6主从同步配置与解决方案
主库IP:192.168.1.10 从库IP:192.168.1.11 centos的mysql配置文件在:/etc/my.cnf 1.主库配置编辑my.cnf: # 启用二进制日志 log_bin ...
- mvc知识应用
mvc 添加 Roche.Models.Logincodes per = new Roche.Models.Logincodes(); per.Qrcode = data.Qrcode; per.Co ...
- lesson9:分布式定时任务
在实际的开发过程中,我们一定会遇到服务自有的定时任务,又因为现在的服务都是分布式的,但是对于定时任务,很多的业务场景下,还是只希望单台服务来执行,网上有很多分布式定时任务的框架,各位如感兴趣,可以自行 ...
- IOS学习教程
http://edu.51cto.com/course/course_id-566.html
- xml--通过DOM解析XML
此文章通过3个例子表示DOM方式解析XML的用法. 通过DOM解析XML必须要写的3行代码. step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) step 2:获得具体的dom解 ...
- JavaScript高级编程II
原文地址: http://www.onlamp.com/pub/a/onlamp/2007/08/23/advanced-javascript-ii.html?page=1 在前面的文章中, ...