美文网首页
KVO—联动观察

KVO—联动观察

作者: 一叶知秋0830 | 来源:发表于2019-12-18 15:35 被阅读0次

场景一:

比如有个Student类如下:

@interface Student : NSObject

@property (nonatomic , assign) NSInteger englishScore; // 英语分数
@property (nonatomic , assign) NSInteger mathScore; // 数学分数
@property (nonatomic , assign) NSInteger chineseScore; // 语文分数
@property (nonatomic , assign) NSInteger totalScore; // 总分

@end

一个学生的总分=英语分数+数学分数+语文分数,三门学科中任意一个分数发生变化总分都会跟着变。如果有个界面只需要展示总分,我们可以通过KVO监听englishScoremathScorechineseScore这三个属性的变化来实现我们的需求。那如果有10门学科,那就得监听10门学科分数的变化,这样太麻烦了,那可不可以只监听totalScore这一关属性就达到相同的效果呢?当然是可以的,这里就需要用到联动观察

Student.m文件中首先重写totalScore属性的getter方法,然后重写keyPathsForValuesAffectingValueForKey方法来设置与这个属性相关联的属性(也就是哪些属性值的改变会影响totalScore的改变)。代码如下。

#import "Student.h"

@implementation Student

// 重写getter方法,也就是如何通过其他属性来计算totalScore的值
- (NSInteger)totalScore{
    return _mathScore + _englishScore + _chineseScore;
}

// 设置关联属性(重写keyPathsForValuesAffectingValueForKey方法)
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key{

    NSMutableSet *set = [[NSMutableSet alloc] initWithSet:[super keyPathsForValuesAffectingValueForKey:key]];
    if ([@"totalScore" isEqualToString:key]) {
        // affectKeys是所有关联属性的属性名
        NSArray *affectKeys = @[@"englishScore",@"mathScore",@"chineseScore"];
        [set addObjectsFromArray:affectKeys];
    }
    return set;
}

@end

场景二:

Stedent类有nameage两个属性,School类有个Student类型的属性,现在要实现Stedent类的任意一个属性的改变都会触发KVO,那我们可以通过KVO同时监听Student实例对象的2个属性变化,这和上面一样,当Stedent类的属性有很多时就会比较麻烦,因为要同时监听很多属性的变化。其实可以和上面一样,设置好相关的keypath后,我们只需要监听School类中的student这一个属性就可以了。代码如下:

// Student.h
@interface Student : NSObject

@property (nonatomic , copy) NSString *name; // 姓名
@property (nonatomic , assign) NSInteger age; // 年龄

@end

// Student.m
#import "Student.h"
@implementation Student

@end

// School.h
#import "Student.h"

@interface School : NSObject

@property (nonatomic , strong) Student *student;

@end

// School.m
#import "School.h"

@implementation School
// 关键就是这里设置相关的keyPath
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key{
    NSMutableSet *set = [[NSMutableSet alloc] initWithSet:[super keyPathsForValuesAffectingValueForKey:key]];
    if ([@"student" isEqualToString:key]) {
        NSArray *affectKeys = @[@"_student.name",@"_student.age"];
        [set addObjectsFromArray:affectKeys];
    }
    return set;
}

@end

相关文章

  • KVO—联动观察

    场景一: 比如有个Student类如下: 一个学生的总分=英语分数+数学分数+语文分数,三门学科中任意一个分数发生...

  • KVO & KVC

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

  • KVO

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

  • iOS崩溃处理机制:KVO Crash

    KVO Crash,通常是KVO的被观察者dealloc时仍然注册着KVO导致的crash,添加KVO重复添加观察...

  • 观察者模式(Observer )

    对象间的联动——观察者模式(一)对象间的联动——观察者模式(二)对象间的联动——观察者模式(三)对象间的联动——观...

  • iOS知识点小结

    1.KVO1.1> KVO 简介:KVO 是 OC 观察者设计模式的一种实现.KVO 指定一个被观察的对象的属性,...

  • iOS-KVO相关

    KVO相关 一、KVO初探 — 响应观察 (一)KVO 使用 的 三部曲 1、添加观察 2、响应 3、析构 (...

  • OC语言之KVO与KVC

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

  • 如何用KVO观察对象的子对象的属性变化

    如何用KVO观察对象的子对象的属性变化?KVO观察多级对象属性变化

  • KVO实现原理

    KVO KVO 是 Key-Value-Observing 的简称。 KVO 是一个观察者模式。观察一个对象的属性...

网友评论

      本文标题:KVO—联动观察

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