ios事件的通知方法

1 手动广播者和监听者(Broadcaster and listeners)

2键-值观察 key Value Observing

3通知中心 notification center

4 上下文通知 context notification

5用于观察的weituo delegate

关于观察者
观察者模式是维持两个模块之间抽象关系的最强大的方式之一。观察者模式包括一个发布已发生事件的模块以及响应该事件的另一模块的若干个的实例。它和直接调 用第二个模块的方法不同,因为第一个模块不需要关注有多少个观察者,从而实现观察者和被观察者之间更加完全的抽象关系。

手动广播者和监听者

手动的方式需要广播者保有一个监听者的数组(NSArray)或集合(NSSet)。在需要通知监听者一个事件的合适时机广播者直接调用各个监听者上相关方法。

在广播者类上你可能需要一个NSMutableArray、NSSet或NSMutableDictionary。NSMutableDictionary比较适合将事件标识符的类型作为每个监听者的键值。在广播者上你还需要有监听者注册和取消注册的方法。
给NSArray或NSSet中的每个对象方式消息的方法很简单,如下:

[listenersCollection makeObjectsPerformSelector:@selector(methodSupportedByEveryListener)];
优点: 广播者对监听者列表有完全的控制。
缺点: 在集合中手动添加或移除监听者(尤其是在由于其他原因已经不被维护的情况下)。如果需要发布不同消息的情况下就需要更多的手动工作。

键值观察
键值观察协议时朝着自动化如上过程方向的一个很大进步。在很多情况下,广播者不需要做任何事情。
每个Cocoa对象自动处理用于发布任何对象的addObserver:forKeyPath:options:context:。如果广播者的 “setter”方法遵循某些规则,“setter”方法就会自动触发任何监听者的 observeValueForKeyPath:ofObject:change:context:方法。
例如如下代码就会在“source”对象上加入一个观察者::

[source      addObserver:destination      forKeyPath:@"myValue"     options:NSKeyValueChangeNewKey      context:nil];
这样在每次调用setMyValue:方法的时候都会发送一个observeValueForKeyPath:ofObject:change:context:消息到destination。
你所需要做的就是在被观察对象上注册监听者并让监听者实现observeValueForKeyPath:ofObject:change:context:。

优点: 内置的而且是自动的。可以观察任何键路径。支持依赖通知。
缺点: 广播者无法知道谁在监听。方法必须符合命名规则以实现自动观察消息的运作。监听者必须在被删除之前被移除,否者接下来的通知就会导致崩溃和失效-不过这对于该文中指出的所有方法都是一样的。

通知中心
NSNotificationCenter提供了一种更加解耦的方式。最典型的应用就是任何对象对可以发送通知到中心,同时任何对象可以监听中心的通知。
发送通知的代码如下:

[[NSNotificationCenter defaultCenter]      postNotificationName:@”myNotificationName”     object:broadcasterObject];
注册接收通知的代码如下:

[[NSNotificationCenter defaultCenter]      addObserver:listenerObject      selector:@selector(receivingMethodOnListener:)      name:@”myNotificationName”     object:nil];
注册通知的时候可以指定一个具体的广播者对象,但这不是必须的。你可能注意到了defaultCenter 。实际上这是你在应用中会使用到的唯一的中心。通知会向整个应用开放,因此只有一个中心。
同时还有一个NSDistributedNotificationCenter。这是用来应用间通信的。在整个计算机上只有一个该类型的中心。
优点: 通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。
缺点: 较键值观察需要多点代码。在删掉前必须移除监听者。

上下文通知
如果被观察属性是一个NSManagedOjbect的声明属性,就可以监听 NSManagedObjectContextObjectsDidChangeNotification。这仍然使用NSNotification方式 不过有点不同,因为NSManagedObject不会手动发送通知。
这种方法的注册如下

[[NSNotificationCenter defaultCenter]      addObserver:listenerObejct      selector:@selector(receivingMethodOnListener:)      name:NSManagedObjectContextObjectsDidChangeNotification      object:observedManagedObjectContext];
在receivingMethodOnListener:中,通知的userinfo中NSInsertedObjectsKey、NSUpdatedObjectsKey和NSDeletedObjectsKey等键值会给出受影响的对象集合。

优点: 是在整个NSManagedObjectContext中跟踪变化的最简单的方式。
缺点: 仅适用于Core Data并不能提供影响对象之外的具体信息。

用于观察的委托
最后一个Cocoa简化的观察者模式是委托。广义上说委托可以不仅仅处理简单的观察,但不一定需要做更多。
比如,NSApplication和NSWindow所有的通知都会同时传给委托并由其处理。有些类会传给它们的委托类似通知的消息,而不同时发送通知。比如NSMenu,发送menuWillOpen:给其委托但不会发送相应的NSNotification。
为了连接一个委托,只需在支持委托的对象上调用如下代码:

[object setDelegate:delegateObject];
对象可以收到任何它想要的委托消息。

优点: 支持它的类有详尽和具体信息。
缺点: 该类必须支持委托。某一时间只能有一个委托连接到某一对象。

时间: 2024-11-03 20:59:35

ios事件的通知方法的相关文章

iOS键盘中英文切换键盘高度获取通知方法

iOS键盘中英文切换键盘高度获取通知方法, 有需要的朋友可以参考下. 注册通知 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotific

Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法

bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore下的index.js,全部引入的要找mint下面mint-ui.common.js 路径如下:你的项目名/node_modules\mint-ui\lib\loadmore\index.js 搜索 handleTouchEnd ,记得写event进去 handleTouchEnd: function

IOS UIImageView直接响应点击事件的解决方法

UIImageView的手势处理可以响应点击事件. 1.  self.allScreenImg.userInteractionEnabled = YES;//UIImageView默认不响应手势,需要开启userInteractionEnabled //处理单击事件 UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickAllScr

iOS开发系列--通知与消息机制

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本地通知 推送通

iOS开发系列--通知与消息机制--转

来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何

iOS 一些文件和方法的基本用法

1. 了解main函数,  UIApplication是初始化程序的核心,它接受4个参数.  其中argc和argv两个参数来自于main()接受的两个参数:另外两个String型参数分别表示程序的主要类(principal class)和代理类(delegate class) 2. plist xml格式文件通常用于储存用户设置pch  预编译文件头xib  Interface Builder 的图形界面设计文档StoryBoard是iOS 5的新特征,旨在代替历史悠久的NIB/XIB 3.

iOS开发-- Notification 通知与消息机制

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本文包括下面内容

iOS开发系列--通知与消息机制(转)

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本地通知 推送通

iOS开发--本地通知与远程通知

iOS开发--本地通知与远程通知 作者 雷潮 关注 2016.02.01 00:18* 字数 1921 阅读 8898评论 1喜欢 41 这里是指推送通知跟NSNotification有区别: 1.NSNotification是系统内部发出通知,一般用于内部事件的监听,或者状态的改变等等,是不可见的2.本地通知与远程通知是可见的,主要用于告知用户或者发送一些App的内容更新,推送一些相关的消息,让用户知道App内部发生了什么事情. Paste_Image.png iOS常用通知 1.本地推送通知