IOS 설계 모드의 4: 관찰자 모드

6276 단어 관찰자 모드
cocoa 프레임워크에서 관찰자 모드를 많이 사용했어요.

KVO


Key-Value Observing은 지정된 객체의 속성이 수정되면 객체가 공지를 받는 메커니즘을 제공합니다.KVO는 관찰할 객체의 등록 정보를 수정할 때마다 해당 관찰자에게 자동으로 알립니다.
모델의 정의:
@interface StockData : NSObject {

    NSString * stockName;

    float price;

}

@end

@implementation StockData

@end

controller에서 사용하는데 전편에서 뭐라고 했는지 기억나세요?여기는 모형에게 내가 너의 업데이트 방송을 청취할 것이라고 말하는 것과 같다
- (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];



}

사용자는 View의 button 호출 컨트롤러의 action을 누르면 모델의 데이터를 변경합니다
-(void) buttonAction

{

    [stockForKVO setValue:@"20.0" forKey:@"price"];

}

컨트롤러가 실현해야 할 리셋은 방송을 받은 후 내가 무슨 일을 해야 하는지에 해당한다
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    if([keyPath isEqualToString:@"price"])

    {

        myLabel.text = [stockForKVO valueForKey:@"price"];

    }

}

보기 dealloc는 관찰을 취소해야 합니다
- (void)dealloc

{

    [super dealloc];

    [stockForKVO removeObserver:self forKeyPath:@"price"];

    [stockForKVO release];

}

2. Notification


알림 사용은 매우 간단합니다.
우선 리셋을 정의한다. 즉, 내가 무슨 일을 해야 하는지 통지하는 것이다.
- (void)callBack{

    NSLog(@"");

}

그 다음에 등록 통지, 즉 통지 센터에 내가 어떤 통지에 흥미가 있는지 알려준다.
[[NSNotificationCenter defaultCenter] addObserver: self

    selector: @selector(callBack)

    name: @"A "

    object: nil];

셋째, 프로그램 어느 곳에서든 알림을 보낼 수 있다
- (void)getNotofocation{

    NSLog(@"get it.");

    // 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"A " object:self];

}

물론 필요할 때 등록 통지를 취소할 수도 있다.

좋은 웹페이지 즐겨찾기