美文网首页
KVO键值依赖

KVO键值依赖

作者: Kasign | 来源:发表于2017-07-30 14:16 被阅读0次

一个属性与有限个属性关联,例如下面的totalAge与user1和user2的age息息相关,只要其中一个改变,totalAge就会改变。

//
//  Person.h
//
//  Created by Walg on 2017/7/29.
//  Copyright © 2017年 Walg. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic,copy)NSString *pName;
@property (nonatomic,assign)NSInteger age;
@end

Person.m中未做任何处理!

//
//  Card.h
//
//  Created by Walg on 2017/7/29.
//  Copyright © 2017年 Walg. All rights reserved.
//

#import <Foundation/Foundation.h>
#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<NSString *> *)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 ViewController


static 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<NSKeyValueChangeKey,id> *)change context:(void *)context{
    NSLog(@"keyPath:%@",keyPath);
    NSLog(@"object:%@",object);
    NSLog(@"change:%@",change);
}

-(void)touchesEnded:(NSSet<UITouch *> *)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:<Card: 0x60800003dfa0>
2017-07-30 14:14:07.101 键值依赖[62587:1948971] change:{
    kind = 1;
    new = 28;
    old = 18;
}

相关文章

  • KVO键值依赖

    一个属性与有限个属性关联,例如下面的totalAge与user1和user2的age息息相关,只要其中一个改变,t...

  • KVO

    KVO 简介 KVO 键值观察机制,就是观察指定对象的指定属性变化情况。 KVO 键值观察 依赖于 KVC 健值编...

  • KVC & KVO 原理剖析

    1.KVO 前沿 KVO(Key-Value Observing, 键值观察), KVO的实现也依赖于runtim...

  • iOS NSNotification通知和KVO的使用

    一:KVO: 键值观察 是基于键值编码实现的一种观察者机制,其实现依赖于 Objective-C 强大的 Runt...

  • 面试题

    得物 KVO willchangevalue什么时候调用 键值观察通知依赖于 NSObject 的两个方法: w...

  • 关情纸尾---UIKit基础-简述KVC和KVO

    ♥概述 ♥键值编码KVC ♥点语法和KVC ♥ 键值监听KVO ♥KVO的使用步骤也比较简单:

  • KVO & KVC

    KVO(键值观察者) 什么是KVO,KVO的实现机制是什么? KVO就是键值观察者,是观察者设计模式的实现 使用i...

  • OC中KVO的基本概念和使用方法

    基本概念 KVO(键值观察)是使用获取其他对象的特定属性变化的通知机制。控制器层的绑定技术就是严重依赖键值观察获得...

  • OC语言之KVO与KVC

    KVO 什么是KVO? KVO 是 Key-value observing(键值观察)的缩写。 KVO是Objec...

  • iOS中KVO

    KVO(Key Value Observing,即键值监听) KVO机制NSKeyValueObserving协议...

网友评论

      本文标题:KVO键值依赖

      本文链接:https://www.haomeiwen.com/subject/nyohlxtx.html