KVO의 개요적인 사용
4440 단어 사용
개술
KVO, 즉 Key-Value Observing은 지정된 객체의 속성이 수정되면 객체가 알림을 받는 메커니즘을 제공합니다.쉽게 말하면 매번 지정된 관찰된 대상의 속성이 수정되면 KVO는 자동으로 해당하는 관찰자에게 통지한다.
둘째, 사용 방법
시스템 프레임워크는 KVO를 지원하기 때문에 프로그래머가 사용할 때 매우 간단합니다.
1. 등록, 피관찰자의 속성을 지정,
2. 리셋 방법 실현
3. 관찰 제거
셋째, 인스턴스:
한 장면을 가정하면 주식의 가격이 현재 화면에 나타나고 주식 가격이 바뀔 때 실시간으로 그 가격을 업데이트한다.
1. DataModel 정의
@interface StockData : NSObject {
시스템 프레임워크는 KVO를 지원하기 때문에 프로그래머가 사용할 때 매우 간단합니다.
1. 등록, 피관찰자의 속성을 지정,
2. 리셋 방법 실현
3. 관찰 제거
셋째, 인스턴스:
한 장면을 가정하면 주식의 가격이 현재 화면에 나타나고 주식 가격이 바뀔 때 실시간으로 그 가격을 업데이트한다.
1. DataModel 정의
@interface StockData : NSObject {
float price;
@end
@end
@interface StockData : NSObject {
NSString * stockName;
float price;
}
@end
@implementation StockData
@end
2. 이 모델을 Controller의 속성으로 정의하고 이를 실례화하며 그 속성을 감청하여 현재 View에 표시
- (void)viewDidLoad
[super viewDidLoad];
stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"10.0" forKey:@"price"];
myLabel.textColor = [UIColor redColor];
[self.view addSubview:myLabel];
UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
- (void)viewDidLoad
{
[super viewDidLoad];
stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"searph" forKey:@"stockName"];
[stockForKVO setValue:@"10.0" forKey:@"price"];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
myLabel.textColor = [UIColor redColor];
myLabel.text = [stockForKVO valueForKey:@"price"];
[self.view addSubview:myLabel];
UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
b.frame = CGRectMake(0, 0, 100, 30);
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:b];
}
3. button을 눌렀을 때 buttonAction 방법을 호출하여 대상의 속성을 수정합니다
-(void) buttonAction
[stockForKVO setValue:@"20.0" forKey:@"price"];
-(void) buttonAction
{
[stockForKVO setValue:@"20.0" forKey:@"price"];
}
4. 리셋 방법 실현
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
if([keyPath isEqualToString:@"price"])
myLabel.text = [stockForKVO valueForKey:@"price"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:@"price"];
}
}
5. 관찰을 늘리고 취소하는 것은 쌍으로 나타나기 때문에 마지막에 관찰자를 제거해야 한다
- (void)dealloc
[super dealloc];
[stockForKVO release];
- (void)dealloc
{
[super dealloc];
[stockForKVO removeObserver:self forKeyPath:@"price"];
[stockForKVO release];
}