IOS-浅谈通知机制

?每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信

?任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知,如图:

?一个完整的通知一般包含3个属性:

1- (NSString *)name; // 通知的名称

2- (id)object; // 通知发布者(是谁要发布通知)

3- (NSDictionary *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)

?初始化一个通知(NSNotification)对象

1+ (instancetype)notificationWithName:(NSString *)aName
object:(id)anObject;

2+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;

3- (instancetype)initWithName:(NSString *)name object:(id)object
userInfo:(NSDictionary *)userInfo;

通知中心(NSNotificationCenter)提供了相应的方法来帮助发布通知

?- (void)postNotification:(NSNotification *)notification;

介绍:发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等

?- (void)postNotificationName:(NSString *)aName object:(id)anObject;

介绍:发布一个名称为aName的通知,anObject为这个通知的发布者

?- (void)postNotificationName:(NSString *)aName object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;

介绍:发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息

注册通知监听器:通知中心(NSNotificationCenter)提供了方法来注册一个监听通知的监听器(Observer)

?- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString
*)aName object:(id)anObject;

1.observer:监听器,即谁要接收这个通知

2.aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入

3.aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知

4.anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知

?- (id)addObserverForName:(NSString *)name object:(id)obj
queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification
*note))block;

1.name:通知的名称

2.obj:通知发布者

3.block:收到对应的通知时,会回调这个block

4.queue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行

取消注册通知监听器:

?通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃

?通知中心提供了相应的方法来取消注册监听器

1- (void)removeObserver:(id)observer;

2- (void)removeObserver:(id)observer name:(NSString *)aName
object:(id)anObject;

?一般在监听器销毁之前取消注册(如在监听器中加入下列代码):

- (void)dealloc {

//[super dealloc];  非ARC中需要调用此句

[[NSNotificationCenter defaultCenter]
removeObserver:self];

}

通知和代理的区别和选择

?共同点

1.利用通知和代理都能完成对象之间的通信

(比如A对象告诉D对象发生了什么事情, A对象传递数据给D对象)

?不同点

2.代理 : 一对一关系(1个对象只能告诉另1个对象发生了什么事情)

3.通知 : 多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)

补充:键盘通知

?我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态

?

?键盘状态改变的时候,系统会发出一些特定的通知

1.UIKeyboardWillShowNotification // 键盘即将显示

2.UIKeyboardDidShowNotification // 键盘显示完毕

3.UIKeyboardWillHideNotification // 键盘即将隐藏

4.UIKeyboardDidHideNotification // 键盘隐藏完毕

5.UIKeyboardWillChangeFrameNotification // 键盘的位置尺寸即将发生改变

6.UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕

IOS-浅谈通知机制,布布扣,bubuko.com

时间: 2024-10-23 14:40:39

IOS-浅谈通知机制的相关文章

浅谈 Attention 机制的理解

什么是注意力机制? 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制.例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点.然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息. 图片来源:深度学习中的注意力机制,其中红色区域表示更关注的区域. Encoder-Decoder 框架 目前大多数的注意力模型都是依附在 Encoder-Decoder 框架下,

iOS浅谈如何进行网络判断

由于近段时间工作太忙,博客都有一段时间没有进行更新了,现在就来浅谈一下网络的判断,如有错误请各位大神能够指出来共同学习一下,谢谢!下面就进入正题了: 1.添加源文件(两个)下载地址:http://code4app.com/ios/Reachability/509743dc6803fae669000000 2.导入框架[SystemConfiguration.framework] 3.创建网络连接 3.1 创建互联网连接的对象 Reachability *reach1 = [Reachabilit

iOS开发-消息通知机制(NSNotification和NSNotificationCenter)

iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页面A,页面C的值改变也需要映射到页面A,那么就需要需要两个委托解决问题.NSNotificaiton则是一对多注册一个通知,之后回调很容易解决以上的问题. 基础概念 iOS消息通知机制算是同步的,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完

iOS 浅谈对MVC、传值、和沙盒机制的理解

1.简述你对MVC的理解? MVC是一种架构设计,它考虑了三种对象:Model(模型对象).View(试图对象).Controller(试图控制器) (1)模型:负责存储.定义.操作数据 (2)视图:用来展示数据给用户和用户进行操作交互 (3)控制器是M与V的协调者,控制器获取数据,将数据交给视图去展示 2.简单描述Controllers之间的传值方式有哪几种? (1)属性传值 (2)block传值 (3)代理传值 (4)单例传值 (5)通知传值:谁要监听值得变化,谁就注册通知 3.如何理解iO

iOS 浅谈本地通知 UILocalNotification

1.创建本地通知 UILocalNotification *local = [[UILocalNotification alloc] init]; 2.设置通知显示的时间 local.fireDate = [NSDate date]; 3.设置默认时区 local.timeZone = [NSTimeZone defaultTimeZone]; 4.设置提示内容 local.alertBody = @JPG下载完成,请即时查看!; 5.这个通知到时间时,你的应用程序右上角显示的数字. local

浅谈binder机制

前段时间一直在看有关Binder的知识,最近刚好有时间,总结一些一些知识,希望和大家交流学习. 说起Binder我相信大家学android开发的多多少少都对binder有些了解,binder机制作为android进程间通信的一种机制,在Android底层中应用的非常多.我们都知道Android系统是基于LInux内核开发的,Linux内核提供了丰富的进程间通信的机制,如:管道.信号.消息队列.共享内存和套接字等,但是Android系统并没有采用传统的进程间通信机制,而是开发了一套新的进程间通信的

[iOS]浅谈NSRunloop工作原理和相关应用

一. 认识NSRunloop  1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main.m文件,一个ios程序启动后,只有短短的十行代码居然能保持整个应用程序一直运行而没有退出,是不是有点意思?程序之所以没有直接退出是因为UIApplicationMain这个函数内部默认启动了一个跟主线程相关的NSRunloop对象,而UIApplicationMain这个函数一直执行没有返回就保存

iOS 浅谈架构 架构设计的方法论

摘要:iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第一篇,主要讲架构设计的通识和方法论等,同时还讨论了大家关心的架构分层.是否要有common文件夹等问题. 缘由 之前安居客iOS app的第二版架构大部分内容是我做的,期间有总结了一些经验.在将近一年之后,前同事zzz在微信朋友圈上发了一个问题:假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 当时看到这个问题正好在乘公车回家的路上

浅谈多态机制的意义及实现

转自:http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html: 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorp