1.
KVO
和通知(Notification)
同屬于觀察者模式.
2.觀察者模式的定義:
觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己膀捷。 簡而言之茎截,就是A和B奋献,A對B的變化感興趣案训,就注冊為B的觀察者,當B發(fā)生變化時通知A速警,告知B發(fā)生了變化灌闺。這個也叫做經(jīng)典觀察者模式。
3.觀察者模式的介紹
設計模式之觀察者模式
具體使用如下:
#import <Foundation/Foundation.h>
@interface ProductInfoModel : NSObject
@property (nonatomic,strong) NSString *name;
@property (nonatomic,strong) NSString *price;
@property (nonatomic,assign) float number;
@end
#import "ProductInfoModel.h"
@implementation ProductInfoModel
@end
- (void)viewDidLoad {
[super viewDidLoad];
infoModel = [[ProductInfoModel alloc]init];
[infoModel addObserver:self
forKeyPath:@"number"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:nil];
}
#pragma mark 監(jiān)聽代理
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"number"])
{
NSLog(@"%@",[object valueForKey:@"number"]);
NSLog(@"ChangeInfo:%@",change);
}
}
#pragma mark 改變所要監(jiān)聽的對象的值
- (IBAction)changeNumber:(id)sender
{
UIStepper *stepper = (UIStepper *)sender;
[infoModel setValue:[NSString stringWithFormat:@"%.f",stepper.value] forKey:@"number"];
}
#pragma mark 釋放觀察者
- (void)dealloc
{
[infoModel removeObserver:self forKeyPath:@"number"];
}
說明:
1.注冊觀察者時options
的作用
NSKeyValueObservingOptionNew
是記錄最新的數(shù)值坏瞄,NSKeyValueObservingOptionOld
是記錄上一個數(shù)值桂对,如果我們只設置其中一個,觀察者也就只記錄一個鸠匀。我們可以在監(jiān)聽代理的change
中查看對應的數(shù)據(jù)蕉斜,如上,我設置了NSKeyValueObservingOptionNew
和NSKeyValueObservingOptionOld
兩個類型,觀察者記錄infoModel
中number
屬性的數(shù)據(jù)變化也就如下宅此,
2017-06-02 09:18:39.981605+0800 KVO的使用[5489:1643164] 1
2017-06-02 09:18:39.982226+0800 KVO的使用[5489:1643164] ChangeInfo:{
kind = 1;
new = 1;
old = 0;
}
2017-06-02 09:18:40.464422+0800 KVO的使用[5489:1643164] 2
2017-06-02 09:18:40.465041+0800 KVO的使用[5489:1643164] ChangeInfo:{
kind = 1;
new = 2;
old = 1;
}
2.監(jiān)聽代理中的keyPath
一定要和注冊觀察者時的keyPath
一樣机错,不然會監(jiān)聽不到對應值的變化。
3.注冊觀察者和移除觀察者一定要成對出現(xiàn)父腕。我們可以在dealloc
中移除觀察者弱匪,也可以在適當?shù)臅r候手動移除觀察者。