KVO键值依赖
一个属性与有限个属性关联,例如下面的totalAge与user1和user2的age息息相关,只要其中一个改变,totalAge就会改变。
//
//Person.h
//
//Created by Walg on 2017/7/29.
//Copyright ? 2017年 Walg. All rights reserved.
//#import @interface Person : NSObject
@property (nonatomic,copy)NSString *pName;
@property (nonatomic,assign)NSInteger age;
@end
【KVO键值依赖】Person.m中未做任何处理!
//
//Card.h
//
//Created by Walg on 2017/7/29.
//Copyright ? 2017年 Walg. All rights reserved.
//#import
#import "Person.h"
@interface Card : NSObject
@property (nonatomic,assign)NSInteger totalAge;
@property (nonatomic,strong)Person *user1;
@property (nonatomic,strong)Person *user2;
@end
//
//Card.m
//
//Created by Walg on 2017/7/29.
//Copyright ? 2017年 Walg. All rights reserved.
//#import "Card.h"@implementation Card- (instancetype)init
{
self = [super init];
if (self) {
_user1 = [[Person alloc] init];
_user2 = [[Person alloc] init];
}
return self;
}-(NSInteger)totalAge{
return _user1.age+_user2.age;
}+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
NSArray *moreKeyPaths = nil;
if ([key isEqualToString:@"totalAge"])
{
moreKeyPaths = [NSArray arrayWithObjects:@"user1.age", @"user2.age", nil];
}if (moreKeyPaths)
{
keyPaths = [keyPaths setByAddingObjectsFromArray:moreKeyPaths];
}
return keyPaths;
}@end
使用:
//
//ViewController.m
//键值依赖
//
//Created by Walg on 2017/7/30.
//Copyright ? 2017年 Walg. All rights reserved.
//#import "ViewController.h"
#import "Card.h"
@interface ViewController ()
@property (nonatomic,strong)Card *userCard;
@end@implementation ViewControllerstatic NSInteger NewAge(){
static NSInteger newAge = 10;
return newAge++;
}- (void)viewDidLoad {
[super viewDidLoad];
_userCard = [[Card alloc] init];
_userCard.user1.pName = @"a";
_userCard.user1.age = 18;
[self.userCard addObserver:self forKeyPath:@"totalAge" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"keyPath:%@",keyPath);
NSLog(@"object:%@",object);
NSLog(@"change:%@",change);
}-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
self.userCard.user2.age = NewAge();
}- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}@end
log:
2017-07-30 14:14:07.100 键值依赖[62587:1948971] keyPath:totalAge
2017-07-30 14:14:07.101 键值依赖[62587:1948971] object:
2017-07-30 14:14:07.101 键值依赖[62587:1948971] change:{
kind = 1;
new = 28;
old = 18;
}
推荐阅读
- 带有Hilt的Android上的依赖注入
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- Vue源码分析—响应式原理(二)
- 依赖注入模块
- IDEA使用Maven管理项目包,缺少pom文件中引入的依赖包
- SpringBoot解决Shiro导致依赖注入的bean事务失效问题
- spring5源码系列--循环依赖|spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
- SpringBean单例情况下解决循环依赖的原理
- Android|Android Room 的坑
- iOS|iOS KVO深入浅出