KVO:(Key-Value-Observer)鍵值觀察者,是觀察者設(shè)計(jì)模式的一種實(shí)現(xiàn)方式
KVO觸發(fā)機(jī)制:一個(gè)對象(觀察者),監(jiān)測另一對象(被觀察者)的某屬性是否發(fā)生變化,若被監(jiān)測的屬性發(fā)生更改,會(huì)觸發(fā)觀察者的一個(gè)方法(方法名固定,類似代理方法)
KVO使用步驟:
- 注冊觀察者(為被觀察者指定觀察者以及被觀察屬性)
- 實(shí)現(xiàn)回調(diào)方法
- 觸發(fā)回調(diào)方法(被觀察屬性發(fā)生更改)
- 移除觀察者
-------------------ViewController.m-----------------
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *array;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.array = [NSMutableArray array];
// 添加一個(gè)觀察者
// 第一個(gè)self表示觀察者
// 第二個(gè)參數(shù) : 被觀察者
// 第三個(gè)參數(shù) : 觀察的屬性
// 第四個(gè)參數(shù) : 保險(xiǎn),可以添加一些字符串
[self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
// 開發(fā)過程中少用KVO
}
// 觀察者模式觸發(fā)的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"keyPath ==== %@", keyPath);
NSLog(@"object ==== %@", object);
NSLog(@"change ==== %@", change);
}
- (void)dealloc
{
// 寫了KVO以后,一定要寫移除觀察者的方法
[self removeObserver:self forKeyPath:@"array"];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 蘋果官方不建議觀察數(shù)組
NSArray *array = @[@"1", @"2"];
[[self mutableArrayValueForKey:@"array"] setArray:array];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end