《企业级ios应用开发实战》一3.4 KVO模型

简介: 本节书摘来自华章出版社《企业级ios应用开发实战》一 书中的第3章,第3.4节,作者:杨宏焱,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 KVO模型

KVO(key-value observer,“键-值”观察)模型是Cocoa绑定技术中常用的一种编程模型,它可以使一个对象在属性值发生变化时主动通知另一个对象并触发相应的方法。与NSNotification 不同,KVO没有所谓的中心对象来为所有观察者提供变化通知。当“被观察者”对象状态发生变化时,通知被直接发送至“观察者”对象,如图3-1所示。
screenshot

在图3-1中,观察者是aButton,被观察者是modelObject。aButton是一个按钮控件,它是一个UI对象,有一个BOOL型的enabled属性,表示按钮是否可被点击。modelObject对象是一个模型对象,它没有可以呈现给用户的界面,同样,它有一个BOOL属性selected。通过KVO模型,modelObject的selected属性可以绑定到UIButton的enabled属性。即当modelObject的selected属性发生变化时(这是可以被编程的),KVO会主动通知aButton这种改变,因此按钮的外观随之可发生相应的呈现。比如由不可点击的灰色改变为可点击的着色状态。
KVO是一种很有用的绑定技术(Cocoa还提供另外一种绑定技术:Dynamic bingding)。而且它是由被观察的对象主动通知观察者的,并不需要经过一个统一的通知中心(如后面章节介绍的通知技术所述),它的执行效率和适用场景要更佳。
为了实现KVO,你需要进行如下操作:
注册观察者。所谓观察者即对象状态变化时需要通知的对象。
接收变更通知。接收变更通知主要是让观察者实现指定方法,在指定方法中,你可以接收到对象状态变更的消息,并在方法中进行处理。
取消所注册的观察者。观察者处理完状态变更消息之后,需要取消原先的注册状态。

3.4.1 注册KVO

对象要将自己注册为观察者,必须发送一个addObserver:forKeyPath:options:context:消息至被观察对象:

[account addObserver:inspector
             forKeyPath:@"name"
                 options:(NSKeyValueObservingOptionNew |
                            NSKeyValueObservingOptionOld)
                 context:NULL];

以上例子将inspector对象注册为account对象的观察者,并表明观察者将对名为“name” 的属性变更感兴趣。
forKeyPath参数“name”注明了需要观察的属性的关键路径KeyPath。关键路径KeyPath实际是一个字符串,用于表示某个属性,你可以直接用属性名。但如果某属性是一个对象,则KeyPath可以用“.”语法的形式表示对象成员,如“account.name”。
options参数注明了对该属性的何种状态感兴趣。NSKeyValueObservingOptionNew表示属性在变更后的新值,NSKeyValueObservingOptionOld表示属性未改变之前的值。以上例子中的option参数设置表明,当name属性变更时,会将这两个值以NSDictionary的方式(即change参数)提交给观察者,观察者可以从NSDictionary中以键-值对的方式检索到这两个值。
context参数用于传递一个对象,该对象(或指针)会在属性变化时通过变更通知传递给观察者(通过context参数)。
移除观察者的注册,使用方法removeObserver forKeyPath:

[subject removeObserver:observer forKeyPath:@"name"];

3.4.2 接收变更通知

观察者要想收到对象的属性变更通知,需要实现方法observeValueForKeyPath:ofObject: change:context:,并在其中进行通知的处理。例如:

- (void)observeValueForKeyPath:(NSString )keyPath
                 ofObject:(id)object
                     change:(NSDictionary )change
                     context:(void )context
{
  NSLog(@"%@",keyPath);
    if ([keyPath isEqual:@"name"]) {
        NSLog(@"name is changed:%@",
        [change objectForKey:NSKeyValueChangeNewKey]);
    }else
    [super observeValueForKeyPath:keyPath
                     ofObject:object
                     change:change
                     context:context];
}

3.4.3 发送变更通知

NSObject支持两种属性变更通知,一种是自动变更通知,一种是手动变更通知。一般情况下,使用自动变更通知则更为简单,因此我们主要介绍自动变更通知。
1.自动变更通知
要使用自动变更通知,需要实现被观察者的 automaticallyNotifiesObserversForKey方法,在此方法中明确说明需要使用自动变更通知的属性。对于需要使用自动变更通知的属性,返回YES,如下代码所示:

+ (BOOL) automaticallyNotifiesObserversForKey:(NSString)key
{
// 对于属性name ,使用自动通知
    if ([key isEqualToString:@"name"])
    {
        return YES;
    }
// 确保调用了父类的automaticallyNotfiesObserversForKey方法
    return [super automaticallyNotifiesObserversForKey:key];
}

然后,在name属性发生变化的时候通知观察者,比如调用以下语句之一:

subject.name=newName;
[subject setValue:newName forKey:@"name"];
[subject setValue:newName forKeyPath:@"name"];

如果属性是集合类型,则可以使用方法mutableSetValueForKey来支持以下集合方法导致的自动变更通知:
添加:insertObject:InKey:或者insertObject:AtIndex:
替换:replaceObject:InKey:或者replaceObject:AtIndex:
删除:removeObjectFromKey:或者removeObjectAtIndex:
2.手动变更通知
对于手动变更通知,除了需要在automaticallyNotifiesObserversForKey:方法中将要使用的手动变更通知返回NO外,还需要 在改变值之前调用willChangeValueForKey:并在更改它之后调用didChangeValueForKey:。
为了便于你理解KVO模型,我做了一个示例程序,放在光盘“source/第3章/TestKVO”文件夹,它使用了本节所介绍的知识点,可供参考和学习。

相关文章
|
6天前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:使用 Core Image 和 Metal 进行高效滤镜应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能是现代应用程序开发中的一个关键需求。苹果的iOS平台提供了Core Image和Metal两大技术,它们为开发者提供了强大的工具来实现复杂的图像处理任务。本文将探讨如何使用Core Image进行基础图像处理,并结合Metal的性能优势,开发出一个自定义的实时图像滤镜。我们将通过创建一个能够动态调整参数并且具有实时反馈效果的滤镜来演示这一过程。
|
6天前
|
算法 计算机视觉 iOS开发
iOS 实时图像处理技术:Core Image 框架的应用
【4月更文挑战第8天】 在移动设备上实现高效的图像处理功能,对于提升用户体验和扩展应用程序能力至关重要。苹果公司的iOS平台提供了强大的Core Image框架,它允许开发者以高效和直观的方式执行复杂的图像处理任务。本文将深入探讨Core Image框架的关键特性,并通过实例演示如何在iOS应用中集成实时图像处理功能,不仅提高性能,同时保持了电池寿命的优化。我们将重点讨论面部识别、滤镜应用和性能优化等关键技术点,为读者提供一份全面的iOS图像处理指南。
|
6天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
39 0
|
6天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
6天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
6天前
|
搜索推荐 API iOS开发
利用SwiftUI构建动态iOS天气应用
【4月更文挑战第23天】 在本文中,我们将探讨如何使用SwiftUI框架实现一个动态的iOS天气应用程序。将重点介绍如何通过集成第三方天气API、设计响应式用户界面以及应用数据绑定技术来增强用户体验。我们的目标是创建一个能够根据当前位置实时更新天气信息的应用,并确保其界面简洁、易用且美观。
18 0
|
6天前
|
存储 编解码 JSON
利用SwiftUI构建高效iOS天气应用
【4月更文挑战第21天】 在本文中,我们将深入探讨如何运用SwiftUI框架打造一个响应迅速且用户友好的iOS天气应用程序。我们将重点放在利用SwiftUI的声明式语法简化界面开发,并通过结合Core Location和Networking APIs实现实时天气数据的获取与展示。文章将详细阐述整个开发过程,包括API集成、数据模型设计、用户界面布局以及动态适配不同屏幕尺寸的策略。
|
6天前
|
缓存 算法 计算机视觉
iOS 实时图像处理技术的应用与实现
【4月更文挑战第8天】 随着智能手机的普及和性能的不断提升,移动设备上的图像处理技术已经成为了研究和应用的热点。特别是在iOS平台上,利用高效的API和强大的硬件支持,开发者能够实现复杂的图像处理任务,为用户提供丰富的视觉体验。本文将探讨在iOS环境下实时图像处理技术的实现,涵盖关键的技术点,如Core Image框架的使用、自定义滤镜的开发以及性能优化等方面,旨在为开发者提供实用的指导和参考。
|
6天前
|
安全 数据安全/隐私保护 虚拟化
iOS应用加固方案解析:ipa加固安全技术全面评测
iOS应用加固方案解析:ipa加固安全技术全面评测
49 3
|
6天前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
84 0