`

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];
对象可以收到任何它想要的委托消息。

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

 

http://kevin1366204484.blog.163.com/blog/static/17196620820121305238839/

分享到:
评论

相关推荐

    IOS滚动文本通知

    在iOS操作系统中,滚动文本通知(也称为横幅通知或滑动通知)是一种常见的用户界面元素,用于在设备屏幕上显示新消息、提醒或其他系统事件。这些通知通常会短暂地从屏幕顶部滑入,然后自动消失,除非用户点击它们以...

    iOS10通知及通知拓展Extension使用

    iOS10引入了全新的通知框架,为开发者提供了更强大的通知定制能力,同时也引入了通知扩展(Notification Service Extension)和通知内容扩展(Notification Content Extension),使得通知不仅仅是简单的文字提示,...

    iOS利用通知模式传值

    在iOS开发中,数据传递是应用之间或应用内部组件间通信的重要环节。...尽管属性赋值等方法在某些情况下更为直接,但通知模式提供了更大的灵活性,并且在系统层面支持了大量内建的功能,使其成为iOS开发中的重要技术。

    ios-通知中心.zip

    "ios-通知中心.zip"这个压缩包很可能包含了关于iOS通知中心的详细资料,可能包括设置指南、自定义方法以及优化策略等内容。 首先,通知中心的基本功能是显示来自各个应用的通知,这些通知可以是文本消息、邮件、...

    安卓版iOS系统通知栏

    安卓版的IOS7系统通知栏,可在安卓手机上完美展现出IOS风格的系统通知!

    iOS常用事件传递方法

    标题提到的"iOS常用事件传递方法"主要包括委托(delegate)、通知(Notification)以及Block这三种方式。下面将详细讲解这三种方法,并结合描述中的例子——调用系统打电话功能,来阐述它们的应用。 1. 委托...

    ios 通知实现原理

    本篇将深入探讨iOS通知的实现原理,包括本地通知和远程推送通知,以及它们在模拟环境中的工作流程。 1. **本地通知(Local Notifications)** - **定义**:本地通知是由应用程序本身在特定时间点或基于特定条件...

    ios 仿QQ通知

    在iOS开发中,模仿QQ的通知弹出提示框是一项常见的任务,尤其对于那些希望提供类似社交应用体验的应用来说。本文将详细讲解如何实现这样的功能,并基于提供的"LeafNotification-master"项目进行解析。 首先,我们...

    网页模板——基于jQuery仿ios5 通知中心弹出振动插件效果.zip

    1. **模拟滑动效果**:iOS的通知中心通常会从屏幕顶部滑下来,这种效果可以通过CSS3的`transform`属性和jQuery的动画方法来实现。通过改变元素的`translateY`值,可以模拟从上至下的滑动动画。 2. **弹出效果**:当...

    ios——通知

    在iOS开发中,"通知"(Notification)是一个关键的概念,它允许应用在特定事件发生时向用户发送消息,即使应用不在前台运行也能实现。这里我们将深入探讨iOS的通知系统,包括本地通知(Local Notification)和远程...

    ios 通知中心

    本文将深入探讨“iOS通知中心”的相关知识点,包括本地通知和远程通知(Push Notification)、通知设置、自定义通知样式以及在实际开发中的应用。 一、本地通知 本地通知是应用程序在设备上预先安排的提醒,无需...

    iOS 通知中心

    iOS的通知中心是操作系统提供的一种重要功能,用于向用户展示来自各种应用的实时更新和提醒。在iOS设备上,无论用户正在使用哪个应用,系统都可以通过通知中心适时地将信息推送给用户,确保用户不会错过任何关键信息...

    ios 读写iOS系统中日历事件

    本Demo的核心是一个名为"CalendarEventSdk"的SDK,它提供了一套简便的方法来操作日历事件,不仅在当前Demo中发挥着关键作用,也能方便地被移植到其他iOS项目中。 首先,我们要了解EventKit框架的基本概念。EventKit...

    iOS学习——通知机制-代码

    4. 使用`UNUserNotificationCenter`的`add(_:withCompletionHandler:)`方法添加请求到通知中心。 例如: ```swift let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert...

    iOS 传值方法(属性传值、代理传值、Block、通知、单例)

    本文将深入探讨五种主要的传值方法:属性传值、代理传值、Block、通知(NSNotification)以及单例(Singleton)。每种方法都有其适用场景和优缺点,开发者需要根据实际需求选择合适的方式。 1. **属性传值**: ...

    jQuery ios下拉通知 jQuery ios下拉通知网页特效.zip

    "jQuery ios下拉通知" 是一种针对iOS设备优化的网页特效,它模拟了iOS系统的下拉通知栏,为用户提供了类似的交互体验。这个压缩包包含了一个实现这种效果的资源集合,主要涉及前端技术,包括CSS、JavaScript、jQuery...

    iOS通知消息

    在iOS开发中,通知消息(Notification)是一种常用的技术,用于在应用程序的不同组件之间传递信息,或者在应用程序处于后台甚至未运行状态时提醒用户有新的事件发生。本篇将详细讲解如何在iOS应用中实现简单的通知...

    jquery ios风格提示通知层

    3. **CSS样式**:在`css/iosNotification.css`中,定义iOS通知层的样式,包括背景色、圆角、阴影、字体、图标等,以模拟iOS的视觉效果。确保适应不同的设备和屏幕尺寸,可能还需要使用媒体查询来实现响应式设计。 4...

    ios自定义弹出本地通知

    3. **定义通知触发器**:根据需求选择何时触发通知,可以是基于时间(如`UNCalendarNotificationTrigger`)、基于重复(如`UNTimeIntervalNotificationTrigger`)或者基于事件(如`UNLocationNotificationTrigger`)...

Global site tag (gtag.js) - Google Analytics