`

iOS概念之KVO(Key-Value Observing)

 
阅读更多
在一个复杂的,有状态的系统中,当一个对象的状态发生改变,如何通知系统,并对状态改变做出相应的行为是必需考虑的一个问题,在iOS中为这类问题提供了4种解决方法:

1. NSNotifiactaion和NSNotificationCenter:通知中心
2. Delegates:代理,
3. Callback:回调,
4. KVO(Key-Value Observing):键值观察

这篇文章就来说说通过KVO通知系统状态发生改变的用法。

KVO是什么?
KVO是Object-C中定义的一个通知机制,其定义了一种对象间监控对方状态的改变,并做出反应的机制。对象可以为自己的属性注册观察者,当这个属性的值发生了改变,系统会对这些注册的观察者做出通知。其用途十分广泛,比方说,你的下载进度条是根据下载百分比决定的,那么,可以通过观察下载百分比的改变,刷新进度条的样式,来直观的反应下载进度等等。

KVO的用法
根据上面的描述,一个KVO的用法主要就涉及3个部分:

1.为对象的属性注册观察者:对象通过调用下面这个方法为属性添加观察者
- (void)addObserver:(NSObject *)observer
         forKeyPath:(NSString *)keyPath
            options:(NSKeyValueObservingOptions)options
            context:(void *)context
           
  • observer: 观察者对象. 其必须实现方法observeValueForKeyPath:ofObject:change:context:.
  • keyPath: 被观察的属性,其不能为nil.
  • options: 设定通知观察者时传递的属性值,是传改变前的呢,还是改变后的,具体的设定可以这儿:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html#//apple_ref/doc/c_ref/NSKeyValueObservingOptions,通常设置为NSKeyValueObservingOptionNew。
  • context: 一些其他的需要传递给观察者的上下文信息,通常设置为nil


2.观察者接收通知,并做出处理:观察者通过实现下面的方法,完成对属性改变的响应:
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context


  • keyPath: 被观察的属性,其不能为nil.
  • object: 被观察者的对象.
  • change: 属性值,根据上面提到的Options设置,给出对应的属性值
  • context: 上面传递的context对象。
               
                 
3.清除观察者:对象通过下面这个方法移除观察者:
- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath


4. 注意事项:
使用KVO消息传递机制有两个要求:(1)观察者必须知道被观察对象,即在同一作用域。(2)观察者还需要知道被观察对象的生命周期,因为在销毁发送者对象之前,需要取消观察者的注册。
另外:如果计划在Core Data对象上使用KVO,需要知道这跟一般的KVO使用方法有点不同。还必须结合Core Data的故障机制(faulting mechanism),一旦core data出现了故障,它将会触发其属性对应的观察者(即使这些属性值没有发生改变)。

5. 一些好的实践
  • (1)当一个观察者观察多个对象的相同属性(即不同Object,但是KeyPath相同),可通过设定静态的Context变量来区分不同的通知。
  • (2)使用NSStringFromSelector(@selector(method))来获取KeyPath,而不是直接通过NSString写属性名,这样编译器可以帮助发现属性名中的Typo。
  • (3)通过方法:+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key,通过一个Key观察多个属性值的改变。


吐槽
这个API的设计真心的不好懂,另外把KeyPath设计为String也太什么了一点。

参考文章:http://beyondvincent.com/blog/2013/12/14/124-communication-patterns/
http://nshipster.com/key-value-observing/
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html
1
0
分享到:
评论
1 楼 asdf_2012 2015-07-16  
也不给个例子,白看了

相关推荐

    KVO (Key Value Observing)

    KVO,全称Key Value Observing,是苹果在其iOS、macOS等操作系统中提供的一种强大的数据绑定技术。它允许一个对象监听另一个对象的某个属性变化,从而实现数据的实时更新和响应式编程。KVO基于Objective-C的动态特性...

    IOS KVC和KVO

    **iOS KVC(Key-Value Coding)与KVO(Key-Value Observing)详解** KVC和KVO是Objective-C及Swift中用于对象属性间接访问和观察的重要技术,它们为开发者提供了灵活的数据绑定和动态属性更新机制。在iOS开发中,...

    ios-KVO底层实现--利用runtime简单的实现KVO底层原理.zip

    Key-Value Observing (KVO)是Objective-C中的一个强大特性,允许我们监听并响应对象属性的变化。在iOS开发中,KVO广泛应用于数据绑定和响应式编程。然而,KVO的底层实现往往被开发者视为黑盒。本篇文章将探讨如何...

    KVO-KVC-demo

    **KVC (Key-Value Coding)** 和 **KVO (Key-Value Observing)** 是Objective-C中的两种重要特性,它们在iOS和Mac OS X开发中被广泛用于对象属性的动态访问和观察。在这个“KVC-KVO-demo”项目中,我们可以深入理解这...

    移动开发(IOS) – Objective-C-10-KVC、谓词、KVO与通知 - iOS知识库1

    Objective-C是iOS开发中的主要编程语言,而KVC(Key-Value Coding)、KVO(Key-Value Observing)以及谓词(Predicates)和通知(Notifications)是Objective-C中非常重要的概念,它们提供了灵活的数据访问和对象间...

    ios-MVC KVO实现.zip

    KVO(Key-Value Observing)是Objective-C中的一个特性,允许对象监听其他对象属性的变化。本项目"ios-MVC KVO实现.zip"似乎是一个关于如何在iOS应用中结合MVC模式和KVO技术的示例。下面将详细讲解MVC模式和KVO的...

    ios-KVO.zip

    **iOS中的Key-Value Observing (KVO)** Key-Value Observing(KVO)是Objective-C中的一个机制,允许对象监听并响应其他对象的属性值变化。在iOS开发中,KVO是一种实用的工具,它能帮助我们实现数据驱动的编程,...

    iOS中KVC-KVO例子

    在iOS开发中,Key-Value Coding (KVC) 和 Key-Value Observing (KVO) 是两种非常重要的机制,它们都是Objective-C中的特性,用于对象属性的动态访问和观察。KVC提供了一种间接访问对象属性的方式,而KVO则允许我们...

    kvo-kvc介绍

    **KVO(Key-Value Observing)与 KVC(Key-Value Coding)是Objective-C中的两种重要机制,它们为开发者提供了强大的数据绑定和属性监听功能。在iOS和macOS开发中,理解并熟练运用KVO和KVC可以极大地提高代码的可...

    iOS KVO设计模式

    Key-Value Observing(KVO)是Objective-C中的一个核心特性,它允许对象监听并响应其他对象属性的变化。KVO是Apple为Objective-C设计的一种观察者模式实现,使得开发者能够方便地跟踪和响应对象属性值的改变。KVO与...

    KVO技术指南 ----ios官方

    **关键-值观察(Key-Value Observing, KVO)**是一种机制,允许对象接收其他对象特定属性变化的通知。它在iOS应用开发中尤为重要,尤其是在模型与控制器层之间的通信中扮演着核心角色。KVO为构建响应式用户界面提供...

    ios kvo详解

    **iOS KVO(Key-Value Observing)详解** Key-Value Observing,简称KVO,是Objective-C中一种强大的机制,允许对象监听并响应其他对象的属性变化。这个功能在iOS开发中尤其有用,因为它提供了数据绑定和反应式编程...

    iOS KVO 监听frame

    在iOS开发中,Key-Value Observing(KVO)是一种强大的机制,允许对象监听其他对象属性的变化。在标题“iOS KVO 监听frame”中,我们关注的是如何使用KVO来跟踪和响应UI控件(如UIView)的frame属性变化。这在布局...

    ios-KVO和枚举的简单理解和使用,仅作学习参考.zip

    在iOS开发中,Objective-C和Swift提供了许多机制来帮助我们处理对象的状态变化,其中KVO(Key-Value Observing)和枚举是两种常见的技术。KVO允许我们观察并响应对象属性值的变化,而枚举则是一种组织和管理一组相关...

    ios-KVO_Demo.zip

    **iOS中的Key-Value Observing (KVO)技术详解** Key-Value Observing(KVO)是Objective-C中的一种机制,允许对象监听并响应其他对象属性的变化。在iOS开发中,KVO是一种强大的数据绑定工具,它使得我们可以方便地...

    ios KVO实现原理

    **iOS KVO(Key-Value Observing)实现原理** Key-Value Observing,简称KVO,是Objective-C中的一种机制,允许对象监听其他对象的属性变化。KVO是Apple为Foundation框架提供的一种强大的数据绑定技术,它使得一个...

    kvo的ios代码

    **KVO(Key-Value Observing)在iOS中的应用** KVO,全称为Key-Value Observing,是Objective-C中的一个强大的机制,它允许对象监听并响应其他对象属性的变化。KVO是Apple的Cocoa框架的一部分,适用于iOS和Mac OS X...

    iOS-RxSwift-KVO、UI控件、手势、通知、定时器、网络请求的使用-Demo

    本文将深入探讨如何在iOS项目中利用RxSwift进行KVO(Key-Value Observing)、UI控件操作、手势识别、通知管理、定时器操作以及网络请求的实现。 ### RxSwift与函数响应式编程 RxSwift是基于ReactiveX的Swift版本,...

    IOS KVO Demo

    **iOS KVO (Key-Value Observing) 演示** KVO,即Key-Value Observing,是Objective-C中的一个强大的机制,用于监听对象属性的变化。它允许一个对象(观察者)订阅另一个对象(被观察者),并在后者属性值改变时...

    ios kvo 实战解析

    **iOS KVO(Key-Value Observing)实战解析** 在iOS开发中,KVO(Key-Value Observing)是一种强大的机制,它允许对象监听其他对象的属性变化。通过注册为观察者,一个对象可以接收到目标对象某个指定键值路径的...

Global site tag (gtag.js) - Google Analytics