KVO—手动触发

2019-12-17  本文已影响0人  一叶知秋0830
// Student.h
@interface Student : NSObject

@property (nonatomic , assign) NSInteger score;

- (void)changeScore:(NSInteger)score;

@end


// Student.m
#import "Student.h"
@implementation Student
// 改变成员变量的值
- (void)changeScore:(NSInteger)score{
    _score = score;
}

@end

如上所示的Student类有个score属性,通过KVO添加观察者监听score属性后,可以通过下面3中方式来改变score的值,但只有通过.语法和KVC赋值这两种方式改变score的值时才会触发KVO

Student *stu = [[Student alloc] init];
[stu addObserver:self forKeyPath:@"score" options:NSKeyValueObservingOptionNew context:NULL];

// 通过3中方式改变score
// 方式一:点语法(也就是通过setter方法赋值)
stu.core = 88;

// 方式二:KVC赋值
[stu setValue:@55 forKey:@"score"];

// 方式三:直接更改成员变量的值(不会触发KVO)
[stu changeScore:33];

如果想要第三种方式也能触发KVO的话就需要手动触发,也就是需要将changeScore:方法改成:

- (void)changeScore:(NSInteger)score{

    [self willChangeValueForKey:@"score"];
    _score = score;
    [self didChangeValueForKey:@"score"];
}
上一篇下一篇

猜你喜欢

热点阅读