当前位置: 首页 > news >正文

IOS 消息机制(NSNotificationCenter)

IOS 消息机制(NSNotificationCenter)

 
消息机制 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];

 

 

转载于:https://www.cnblogs.com/iOS-mt/p/4238875.html

相关文章:

  • DataMatrix二维条码源码分析检测识别图像位置
  • 图像切割之(一)概述
  • 关于HTML5本地存储的sessionStorage与localStorage的简单用法
  • 论存储IOPS和Throughput吞吐量之间的关系
  • Objective - C基础: 第五天 - 6.循环引用
  • 服务器的编码
  • Jquery scrollTop animate 實現動態滾動到頁面頂部
  • 多站点IIS用户安全权限设置图解教程
  • c#将http调用返回额json中的有关中文的unicode转换为中文(转)
  • 断点续传
  • T-SQL查询进阶--变量
  • cocos2dx触屏响应(单点触摸)CCTouchBegan,CCTouchMove,CCTouchEnd
  • JQuery上传插件Uploadify API详解
  • c#鼠标在控件上面,然后显示文字
  • 什么是 ADO.NET?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Angularjs之国际化
  • Docker入门(二) - Dockerfile
  • E-HPC支持多队列管理和自动伸缩
  • Flannel解读
  • JavaScript中的对象个人分享
  • js继承的实现方法
  • maya建模与骨骼动画快速实现人工鱼
  • MySQL-事务管理(基础)
  • spark本地环境的搭建到运行第一个spark程序
  • 大型网站性能监测、分析与优化常见问题QA
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用Gradle第一次构建Java程序
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信开放平台全网发布【失败】的几点排查方法
  • 写给高年级小学生看的《Bash 指南》
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #include到底该写在哪
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (003)SlickEdit Unity的补全
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (算法)Game
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)基于IDEA的JAVA基础12
  • ***监测系统的构建(chkrootkit )
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Micro Framework初体验(二)
  • .NET MVC 验证码
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 读取 JSON格式的数据
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET建议使用的大小写命名原则
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @Controller和@RestController的区别?