Key-Value Observing (簡寫為KVO):當指定的對象的屬性被修改了,允許對象接受到通知的機制。每次指定的被觀察對象的屬性被修改的時候,KVO都會自動的去通知相應的觀察者。
因為KVO模式本身獲得了框架級別的支持,所以開發人員不需要自己設計觀察者模式,不用添加額外的代碼,使用方便。
KVO模式的工作原理:
如果A對象希望在B對象的一個特定屬性改變時,獲得通知消息,就需要使用 addObserver:forKeyPath:options:context進行注冊。
addObserver:forKeyPath:options:context:”方法在指定對象實例之間建立了一個連接。這個連接不是兩個類之間建立的,而是兩個對象實例之間建立的連接。
同時,為了能夠響應消息,對象A必須實現“observeValueForKeyPath:ofObject:change:context:”方法。這個方法實現如何響應變化的消息。在這個方法裡面我們可以跟自己的情況,去實現應對被觀察對象屬性變動的相應邏輯。
這樣當對象B的特定屬性改變時,就會回調對象A中observeValueForKeyPath:ofObject:change:context方法裡面的邏輯, 實現了KVO模式過程。
示例代碼如下:
[cpp]
- (void)viewDidLoad
{
[super viewDidLoad];
_label = [[UILabel alloc] initWithFrame:CGRectMake(20, 50, 50, 30)];
_label.textAlignment = NSTextAlignmentCenter;
_label.font = [UIFont systemFontOfSize:20];
[self.view addSubview:_label];
[self addObserver:self forKeyPath:@"textvalue" options:0 context:nil]; //注冊
[self setValue:[NSNumber numberWithInt:2] forKey:@"textvalue"];
}
// 監聽回調
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"textvalue"]){
NSNumber* num = [self valueForKey:@"textvalue"];
_label.text = [NSString stringWithFormat:@"%d",[num integerValue]];
}
}
shent