8 kvc、kvo的基本概念、谓词的使用以及通知的用法
- 格式:ppt
- 大小:111.50 KB
- 文档页数:16


KVC,KVO的一些原理理解与使用介绍使用KVC、KVO的优势通过规定了一组通用的Cocoa命名法则、调用规则等,实现了如下功能:2 使用一对高度规范化的访问方法,获取以及设置任何对象的任何属性的值。
2 通过继承一个特定的方法,并且指定希望监视的对象及希望监视的属性名称,就能在该对象的指定属性的值发生改变时,得到一个“通知”(尽管这不是一个真正意义上的通知),并且得到相关属性的值的变化(原先的值和改变后的新值)。
2 通过一个简单的函数调用,使一个视图对象的一个指定属性随时随地都和一个控制器对象或模型对象的一个指定属性保持同步。
2. KVC2.1 概述KVC是KeyValue Coding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。
而不是通过调用Setter、Getter方法访问。
当使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。
2.2 如何使用KVC关键方法定义在:NSKeyValueCoding(Dick标注:注意你可以在代码里通过这个关键词跳转到源代码的头文件里看下就明白了,他是NSMutableArray,dictionary等等类的扩展方法的扩展名。
看了源代码后再结合下面的转载内容你就更容易明白了下面说的是什么)KVC支持类对象和内建基本数据类型。
2.2.1 获取值valueForKey:,传入NSString属性的名字。
valueForKeyPath:,传入NSString属性的路径,xx.xx形式。
valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。
2.2.2 修改值setValue:forKey:setValue:forKeyPath:setValue:forUndefinedKey:setNilValueForKey: 当对非类对象属性设置nil时,调用,默认抛出异常。
(转载)OC学习篇之---通知(NSNotificationCenter)在前⼀篇⽂章中我们介绍了OC中很常⽤的两个技术:KVC和KVO,今天我们来看⼀下OC中另外的⼀个常⽤技术:通知(Nofitication)其实这⾥的通知和之前说到的KVO功能很想,也是⽤于监听操作的,但是和KVO不同的是,KVO只⽤来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Android中系统发送的⼴播,我们只能接受。
但是通知就不⼀样了,他的监听发送也是⼜我们⾃⼰控制,我们可以在任何地⽅任何时机发送⼀个通知,类似于Android中开发者⾃⼰发送的⼴播。
从这⼀点看来,通知的使⽤场景更为⼴泛了。
下⾯就来看⼀下例⼦:还是护⼠和⼩孩的那个例⼦Children.h1//2// Children.h3// 44_KVO4//5// Created by jiangwei on 14-10-16.6// Copyright (c) 2014年 jiangwei. All rights reserved.7//89#import <Foundation/Foundation.h>1011@interface Children : NSObject1213 @property NSInteger *hapyValue;141516@end定义了⼀个属性:hapyValueChildren.m1//2// Children.m3// 44_KVO4//5// Created by jiangwei on 14-10-16.6// Copyright (c) 2014年 jiangwei. All rights reserved.7//89#import"Children.h"1011@implementation Children1213 - (id) init{14 self = [super init];15if(self != nil){16//启动定时器17 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];18 self.hapyValue= 100;19 }20return self;21 }2223 - (void) timerAction:(NSTimer *) timer{24//使⽤set⽅法修改属性值,才能触发KVO25 _hapyValue--;26 NSLog(@"%@",_hapyValue);27if(_hapyValue <80){28//发送通知29//这⾥和KVO的区别,我们可以⼿动的发送通知30//注意通知的名称,传递的参数必须和定义通知的地⽅的参数值要⼀致31//将Children对象传递过去32 [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification"object:self];33 }3435 }363738@end定义了⼀个定时器,但是我们看到这⾥的timerAction⽅法中就开始发送⼀个通知了:1//发送通知2//这⾥和KVO的区别,我们可以⼿动的发送通知3//注意通知的名称,传递的参数必须和定义通知的地⽅的参数值要⼀致4//将Children对象传递过去5 [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification"object:self];我们在属性值发⽣变化的地⽅发送⼀个通知:NSNotificationCenter第⼀个参数:通知的名称,这个名称必须和后⾯接受通知的名称⼀致第⼆个参数:可以传递的⼀个参数对象Nure.h1//2// Nure.h3// 44_KVO4//5// Created by jiangwei on 14-10-16.6// Copyright (c) 2014年 jiangwei. All rights reserved.7//89#import <Foundation/Foundation.h>1011@interface Nure : NSObject1213@endNure.m1//2// Nure.m3// 44_KVO4//5// Created by jiangwei on 14-10-16.6// Copyright (c) 2014年 jiangwei. All rights reserved.7//89#import"Nure.h"10#import"Children.h"1112@implementation Nure1314 - (id) init{15 self = [super init];16if(self != nil){1718//监听⼀个通知,当收到通知时,调⽤notificationAction⽅法19 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification"object:nil]; 2021 }22return self;23 }242526 - (void) notificationAction:(NSNotification *)notification{27//这⾥我们拿到Children对象进⾏操作28 Children *children = notification.object;29 NSLog(@"触发通知");30 }3132 - (void)dealloc{33//移除指定的通知,不然会造成内存泄露34 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification"object:nil];3536//Children对象可以添加多个通知37//下⾯的⽅法是可以移除Children中所有通知38 [[NSNotificationCenter defaultCenter] removeObserver:self];39 }4041@end在Nure类中我们开始接受通知了:1//监听⼀个通知,当收到通知时,调⽤notificationAction⽅法2 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification"object:nil];使⽤addObserver⽅法来监听通知:第⼀个参数:监听者对象第⼆个参数:监听处理逻辑的⽅法第三个参数:通知的名称第四个参数:通知发送的时候传递过来的参数对象1、处理通知的⽅法1 - (void) notificationAction:(NSNotification *)notification{2//这⾥我们拿到Children对象进⾏操作3 Children *children = notification.object;4 NSLog(@"触发通知");5 }这⾥会传递⼀个NSNotification对象,通过object属性可以获取到监听对象了,因为我们在发送通知的时候传递过来的这个对象。
Key-Value Observing (键值监测)简介KVO是一套当目标对象的属性值改变时观察者对象能够接受到通知的机制。
必须先理解KVC才能更好的理解KVO,前者是后者的实现基础。
这样的通信机制在MVC设计模式很是常见实现过程简单来说分为3步:1、添加观察这和监测对象2、监测对象改变3、收到值改变通知,处理后续逻辑举个生活中的例子就是给银行卡开通短信通知的业务,总体也是分3步“1、去银行办理短信业务2、账号财产变动3、收到短信通知KVO是框架级别的服务,无需自己发送通知,使用方便,基本不需要添加额外代码即可使用。
详情为了使用KVO,必须满足以下3步1、目标对象的属性,必须支持KVO2、注册观察者与被观察者addObserver:forKeyPath:options:context:3、观察者必须实现observeValueForKeyPath:ofObject:change:context:方法第一步、确保目标支持KVO被监测的目标对象的属性支持KVO必须满足以下条件:1、目标对象的属性必须支持KVC,对于1对1属性简单来说就是实现set和get方法。
详情和1对多请阅读官方说明。
系统已有类及子类自动支持,放心使用。
2、自动和手动属性通知目标对象必须能发出属性变化通知。
系统默认支持,也可自定义。
系统默认支持,且支持的很好,一般无需自定义。
//如果需要自定义,需要重新此方法,默认返回YES+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key;//在set方法中手动调用,变化类型只是针对NSKeyValueChangeSetting- (void)willChangeValueForKey:(NSString *)key;- (void)didChangeValueForKey:(NSString *)key;例如//假设有属性@property (nonatomic,copy)NSString *name;+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {BOOL automatic = NO;/* 只自定义指定属性,其它仍然自动发送通知*/if ([theKey isEqualToString:@"name"]){//在set方法中手动调用相关方法automatic = NO;}else{//此方法默认返回YESautomatic = [super automaticallyNotifiesObserversForKey:theKey];}return automatic;}- (void)setName:(NSString *)name{//即将变化[self willChangeValueForKey:@"name"];_name = name;//已经变化[self didChangeValueForKey:@"name"];}//如果说只有值不相等时才发送通知,提升性能- (void)setName:(NSString *)name{if (![name isEqualToString:_name]){[self willChangeValueForKey:@"name"];_name = name;[self didChangeValueForKey:@"name"];}}如果涉及1对多的容器类,需要自己实现NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, NSKeyValueChangeReplacement三种操作对应的方法,例如//Keys为属性名称- (void)removeKeysAtIndexes:(NSIndexSet *)indexes {[self willChange:NSKeyValueChangeRemovalvaluesAtIndexes:indexes forKey:@"keys"];// Remove the transaction objects at the specified indexes.[self didChange:NSKeyValueChangeRemovalvaluesAtIndexes:indexes forKey:@"keys"];}3、属性依赖如果目标对象属性存在依赖关系,注册合适的依赖Keys。
KV值的意义名词解释一、KV值的定义KV值,即键值对,是一种数据结构,用于将一个特定的键与一个特定的值相关联。
在计算机科学和信息技术领域中,KV值通常用于存储和检索数据,是一种非常基础且重要的数据结构。
二、KV值的特点1.键的唯一性:在KV值中,每个键都是唯一的,不能有重复。
这意味着每个键都对应一个特定的值,通过键可以快速准确地定位到相应的值。
2.值的多样性:与键的唯一性不同,值可以是多种多样的数据类型,如字符串、数字、布尔值、列表、字典等。
这使得KV值能够存储和表示各种类型的数据。
3.存储的灵活性:由于KV值的键是唯一的,因此可以轻松地通过键来组织和查询数据。
这种灵活性使得KV值在数据库、缓存系统、配置管理等领域得到广泛应用。
4.易于扩展性:由于KV值以键值对的形式存储数据,因此可以轻松地添加、删除或修改键值对。
这使得KV值在处理大规模数据集时具有良好的扩展性。
三、KV值的应用场景1.数据库系统:在数据库系统中,可以使用KV值来存储和检索数据。
例如,NoSQL数据库中的大多数数据都存储为键值对的形式。
2.缓存系统:在缓存系统中,可以使用KV值来存储经常访问的数据,从而提高数据访问速度。
Redis等缓存系统就是基于KV值实现的。
3.配置管理:在配置管理中,可以使用KV值来存储和获取配置信息。
这样可以方便地管理和修改配置信息,并且易于备份和恢复配置数据。
4.日志记录:在日志记录中,可以使用KV值来存储日志数据。
这样可以方便地查询和分析日志数据,提高日志管理的效率和便利性。
5.网络编程:在网络编程中,可以使用KV值来存储和获取网络请求的数据。
这样可以提高网络请求的响应速度和处理效率。
6.搜索引擎:在搜索引擎中,可以使用KV值来存储网页的元数据,以便快速地索引、排序和检索网页。
这样可以提高搜索引擎的性能和准确性。
7.机器学习和人工智能:在机器学习和人工智能领域中,可以使用KV值来存储和获取训练数据和标签。