​    ​通知(Notification)简单的类比一下,公司的老总给下面的员工发通知啦,说明天公司要上市,各部门做一下准备工作。等通知发完,各部门收到后各司其职,做着自己该做的东西。假如Boss是通过公司的内部论坛发送的通知,那么Boss就是发送通知的对象,而公司员工就是通知的接受方,而公司的内部论坛就是通知中心,员要想接收到Boss发送的通知的前提是先在论坛上注册一下。老板只有一个,而接受通知的有多个部门,老板是通过论坛广播的形式发送的通知。说的高大上一点,通知是一种发送给一个或多个观察着,用来通知其在程序中发生了某个事件的消息。Cocoa中的通知及时遵循的是一种广播的模式。

​    ​暂且这么类比着,这是根据我个人理解而想出的例子,可能会有不足之处,希望大家批评指正,转载请注明出处。

​    ​废话少说,我们如何把上面boss通过论坛发帖的形式来发送通知用Objective-C中的Notification来实现呢,代码走起

​    ​1.一个公司得有老板对吧,所以我们要新建一个老板类,公司的内部论坛就是我们OC中的通知中心(NotificationCenter),看完老板的实现代码在说两句吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@implementation Boss
-(void)sendMessage
{
    //把要发送的信息放入字典中(boss要在论坛中说的话)
    NSDictionary *message = @{@"notification" : @"大家注意啦,明天公司上市!"};
     
    //创建通知对象(老板登陆boss账号)
    NSNotification * notification = [NSNotification notificationWithName:@"boss" object:self userInfo:message];
     
    //向通知中心发送消息(发布消息)
    [[NSNotificationCenter defaultCenter] postNotification:notification];
     
}
@end

​    ​代码说明:

​    ​    ​    ​1.老板要发的消息要放在字典中才能发布,字典的key是帖子的主题,value是帖子的内容

​    ​    ​    ​2.创建通知对象就好比老板登陆内部论坛,用notificationWithName设置老板的昵称

​    ​    ​    ​3.向通知中心发送消息就是老板发帖啦

​2.下面我们就开始模拟各个部门接受通知后要做的事情,人力资源部接到通知后要做的事儿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@implementation HumanResources
- (instancetype)init
{
    self = [super init];
    if (self) {
        //现在通知中心注册,确定要接受谁的消息,(登陆论坛,关注老板)
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"boss" object:nil];
    }
    return self;
}
 
-(void)doSomething:(NSNotification *)notification
{
     
    //接受消息,(从论坛上看到啦boss的消息)
    NSDictionary *bossInfo = [notification userInfo];
    //输出收到的信息
    NSLog(@"人力资源部门收到:%@", bossInfo[@"notification"]);
}
 
 
@end

​代码说明:

​    ​1.注册为观察者相当于各部门要在内部论坛注册并关注老板,在关注老板的同时指定当老板发送通知时自己要做些什么事儿

​    ​2.doSomething里是各部门要做的事情

​3.再添加一个财务部,和上面的代码类似,在这就不写了

​4.在main函数里做如下的测试

1
2
3
4
5
Boss * boss = [[Boss alloc] init];
Finance * finance = [[Finance alloc] init];
HumanResources *hr = [[HumanResources alloc] init];
//老板发消息啦
[boss sendMessage];

​当老板发通知时,各部门会自动调取自动执行的方法,运行结果如下:

1
2
2014-08-20 15:10:29.816 Memory[1946:303] 财务部门收到:大家注意啦,明天公司上市!
2014-08-20 15:10:29.817 Memory[1946:303] 人力资源部门收到:大家注意啦,明天公司上市!

  最后呢,也是最重要的,登录完论坛如果你不使用了,要注销也就是要退出。那么通知也是一样的,你需要在dealloc方法中移除观察者即可。

​    上面的总结暂且这么说吧,是根据笔者自己的理解所总结的内容,不免有偏颇之处,欢迎批评指正,转载请注明出处。

Objective-C中的老板是这样发通知的(Notification)的更多相关文章

  1. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  2. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  3. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  4. Android开发 ---xml构建选项菜单、上下文菜单(长按显示菜单)、发通知、发送下载通知

    1.activity_main.xml 描述: 定义了一个TextView和三个按钮 <?xml version="1.0" encoding="utf-8&quo ...

  5. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  6. Objective - C中属性和点语法的使用

    一.属性        属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性         ...

  7. 点击datalist中Button按钮出现“回发或回调参数无效......”

        遇到问题: 回发或回调参数无效.在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page ...

  8. 如何Vue-cli开始使用在Vue.js项目中启动TDD(测试驱动开发)

    通常,使用测试驱动开发(TDD)最困难的部分是开始.你必须下载带有奇怪依赖项的软件包,让测试套件与你的构建系统协同工作,然后你必须弄清楚如何编写一个测试!难怪这么多的开发者在你提起它的时候就开始跑开了 ...

  9. Objective C中数组排序几种情况的总结

    总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 数组排 ...

随机推荐

  1. java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)

     java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...

  2. Tomcat7安装配置 for Ubuntu

    一.环境说明: 操作系统:Ubuntu 12.04.2 LTS Tomcat:apache-tomcat-7.0.52 二.下载 下载地址:http://tomcat.apache.org/ 这里下载 ...

  3. java-通过JDBC操作数据库

    一.加载驱动 这里我们用Class.forname();来加载驱动,用此语句会提示排除异常. Class.forName("com.mysql.jdbc.Driver"); 括号中 ...

  4. What's the difference between a stub and mock?

    I believe the biggest distinction is that a stub you have already written with predetermined behavio ...

  5. 借助cookie实现子网页修改父网页内容遇到的问题:同一个浏览器访问相同页面,会互相影响。 (已解决)

    问题是这样的,  我把左侧菜单做成了网页, 然后点击左侧菜单选项会改变右侧内容, 也就是子网页访问并修改父网页的内容. 为了兼容性更好, 我没有使用farther,或者opener等方法,  而是用了 ...

  6. SQL服务器在执行这条语句时会先进行运算然后执行

    1.打开地址,我们可以看到是一个正常的页面. 2..然后在地址后面加上-1,变成:http://site/news.asp?id=123-1,若返回的页面和前面不同,是另一个正常的页面,则表示存在注入 ...

  7. Myeclipse中web project各种常见错误及解决方法(持续更新)

    创建web project时的问题 error:Install Dynamic web Module Facet卡住 solution:把网络关掉再创建就可以 Servlet error:The se ...

  8. web api Route属性定义

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  9. 探索c#之storm的TimeCacheMap

    阅读目录: 概述 算法介绍 清理线程 获取.插入.删除 总结 概述 最近在看storm,发现其中的TimeCacheMap算法设计颇为高效,就简单分享介绍下. 思考一下如果需要一个带过期淘汰的缓存容器 ...

  10. MySQL 游标

    概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...