博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS 消息机制(NSNotificationCenter)
阅读量:5908 次
发布时间:2019-06-19

本文共 2266 字,大约阅读时间需要 7 分钟。

 
消息机制 NSNotificationCenter 一直都在频繁使用,但是却对其原理不是十分了解。今天就花些时间,把消息机制原理重头到尾好好过一遍。
iOS 提供了一种 "同步的" 消息通知机制,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。
这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,这种消息广播机制是典型的“Observer”模式。
这个要求其实也很容易实现. 每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏. 对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(我捡到了一只小狗). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster
消息机制常常用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等,就需要用到消息机制。
使用消息机制的步骤:

1. 观察者注册消息通知

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

notificationObserver 观察者 : self

notificationSelector 处理消息的方法名: getUserProfileSuccess 
notificationName 消息通知的名字: Notification_GetUserProfileSuccess
notificationSender 消息发送者 : 表示接收哪个发送者的通知,如果第四个参数为nil,接收所有发送者的通知

 

2. 发送消息通知

//UserProfile Is A Model

//@interface UserProfile : NSObject

[[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_GetUserProfileSuccess" object:userProfile userInfo:nil];

notificationName 消息通知的名字: Notification_GetUserProfileSuccess

notificationSender 消息发送者: userProfile

 

3. 观察者处理消息 

- (void) getUserProfileSuccess: (NSNotification*) aNotification{self.userProfile = [aNotification object];lblName.text = self.userProfile.Name;lblEENO.text = self.userProfile.EENO;lblNric.text = self.userProfile.NRIC;lblBirthday.text =self.userProfile.Birthday;lblHireDate.text = self.userProfile.Hiredate;txtMobilePhone.text = self.userProfile.Mobile;txtEmail.text = self.userProfile.Email;}

 

NSNotification 接受到的消息信息,主要含:

Name: 消息名称 Notification_GetUserProfileSuccess
object: 消息发送者 userProfile
userInfo: 消息传递的数据信息 

 

4. 观察者注销,移除消息观察者

虽然在 IOS 用上 ARC 后,不显示移除 NSNotification Observer 也不会出错,但是这是一个很不好的习惯,不利于性能和内存。

注销观察者有2个方法:

a. 最优的方法,在 UIViewController.m 中:

-(void)dealloc {[[NSNotificationCenter defaultCenter] removeObserver:self];}

 If you see the method you don't need to call [super dealloc]; here, only the method without super dealloc needed.

 

b. 单个移除:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"Notification_GetUserProfileSuccess" object:nil];

 

 

转载地址:http://cqppx.baihongyu.com/

你可能感兴趣的文章
include指令和动作的区别
查看>>
h3c telnet 级别
查看>>
我的友情链接
查看>>
red hat4 安装yum的方法
查看>>
shell脚本-后台执行命令
查看>>
Note: opencart customer login password algrithem
查看>>
Linux下自动备份Oracle数据库并删除指定天数前的备份
查看>>
我的友情链接
查看>>
查询oracle24小时内切换频率
查看>>
网页客户端使用php访问mysql数据时出现NetworkError: 500 Internal Server Error问题的解决方案...
查看>>
(十)表单的渲染
查看>>
(六)模板渲染
查看>>
Cisco路由器安全配置
查看>>
我的友情链接
查看>>
半天打造小型万能OA办公系统, 靠的就是万能表单提交 + 轻量级工作流审批组件...
查看>>
VM的彻底删除
查看>>
我的友情链接
查看>>
CSS技巧笔记
查看>>
我的友情链接
查看>>
WP移动设备压缩与解压控件Xceed Zip for .NET Compact Framework控件下载及详细介绍使用方法...
查看>>