在前一篇文章中我们介绍了OC中很常用的两个技术:KVC和KVO: http://blog.csdn.net/jiangwei0910410003/article/details/41912937,今天我们来看一下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. #import <Foundation/Foundation.h>
  9. @interface Children : NSObject
  10. @property NSInteger *hapyValue;
  11. @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. #import "Children.h"
  9. @implementation Children
  10. - (id) init{
  11. self = [super init];
  12. if(self != nil){
  13. //启动定时器
  14. [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
  15. self.hapyValue= 100;
  16. }
  17. return self;
  18. }
  19. - (void) timerAction:(NSTimer *) timer{
  20. //使用set方法修改属性值,才能触发KVO
  21. _hapyValue--;
  22. NSLog(@"%@",_hapyValue);
  23. if(_hapyValue <80){
  24. //发送通知
  25. //这里和KVO的区别,我们可以手动的发送通知
  26. //注意通知的名称,传递的参数必须和定义通知的地方的参数值要一致
  27. //将Children对象传递过去
  28. [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];
  29. }
  30. }
  31. @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. #import <Foundation/Foundation.h>
  9. @interface Nure : NSObject
  10. @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. #import "Nure.h"
  9. #import "Children.h"
  10. @implementation Nure
  11. - (id) init{
  12. self = [super init];
  13. if(self != nil){
  14. //监听一个通知,当收到通知时,调用notificationAction方法
  15. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];
  16. }
  17. return self;
  18. }
  19. - (void) notificationAction:(NSNotification *)notification{
  20. //这里我们拿到Children对象进行操作
  21. Children *children = notification.object;
  22. NSLog(@"触发通知");
  23. }
  24. - (void)dealloc{
  25. //移除指定的通知,不然会造成内存泄露
  26. [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];
  27. //Children对象可以添加多个通知
  28. //下面的方法是可以移除Children中所有通知
  29. [[NSNotificationCenter defaultCenter] removeObserver:self];
  30. }
  31. @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. [[NSNotificationCenter defaultCenter] removeObserver:self];
  5. }

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

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

总结

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

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

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

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

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

    在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...

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

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

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

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  5. (转载)OC学习篇之---第一个程序HelloWorld

    之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...

  6. OC学习篇之---第一个程序HelloWorld

    从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这里最好还是Java).在干活之前,得先找到 ...

  7. OC学习篇之---谓词(NSPredicate)

    在前一篇文章中我们介绍了OC中一个重要技术通知:http://blog.csdn.net/jiangwei0910410003/article/details/41923401,今天我们在来看一下OC ...

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

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  9. (转载)OC学习篇之---归档和解挡

    前几篇文章说到了OC中的Foundation框架,今天我们来看一下OC中的一个重要知识点:归档 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOu ...

随机推荐

  1. 声明 && 温馨提示 by ljh2000

    听说有人很喜欢狙我......看我不把你们抓起来嘿嘿嘿! 为了采取措施,不让被狙成为生活常态(雾   ,我要闭关锁国辣,我要开始屯田辣! 以后写完题目先存一波草稿,等屯题屯到10-20道时再一起发出来 ...

  2. gosslary

    TM,技术手册(Technical Manual):商标(trademark)

  3. 关于 IOS Runtime Runloop 2

    Runtime 也就是运行时组件,一个纯C语言写的基础库. 我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码 Objective-C编写出来的程序必须得到ru ...

  4. SpringMVC整合fastjson-1.1.41

    以前用fastjson也只是硬编码,就好像这篇博文写的http://blog.csdn.net/jadyer/article/details/24395015 昨天心血来潮突然想和SpringMVC整 ...

  5. HDFS集群balance(3)-- 架构细节

    转载请注明博客地址:http://blog.csdn.net/suileisl HDFS集群balance,对应版本balance design 6 如需word版本,请QQ522173163联系索要 ...

  6. Linux命令之查找

    在Linux中,有非常多方法能够做到这一点.国外站点LinuxHaxor总结了五条命令,你能够看看自己知道几条.大多数程序猿,可能常常使用当中的2到3条,对这5条命令都非常熟悉的人应该是不多的. 1. ...

  7. 跨平台传输中使用base64来保证非ascii码字符串的完整性

    首先,我们来看一个例子: byte[] b=new byte[]{2,9,43}; String ss=new String(b,"utf-8"); byte[] b1=ss.ge ...

  8. linux定时任务1-crontab命令

    简单测试例子: 添加定时任务前,注意查看crond服务是否已经启动,如果未启动,则用命令service crond start命令启动. 注意给脚本添加可执行权限. [root@rheltest1 ~ ...

  9. spring07 JDBC

    1.创建对应的数据库 2.在MyEclipse中创建项目  引入需要的jar包 3.创建数据访问层 public interface StudentDao { //新增学生 int addStuden ...

  10. ExecuteNonQuary接收存储过程的输出类型的变量的值

    1.设置所调用的存储过程需要的参数 public decimal CreateOrder(string orderId, int userId, string address) { SqlParame ...