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"];
}