你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 鍵值觀察(KVO)簡述及實例理解

iOS 鍵值觀察(KVO)簡述及實例理解

編輯:IOS開發綜合
KVO概述:
KVO,即:Key-Value Observing,直譯為:基於鍵值的觀察者。  它提供一種機制,當指定的對象的屬性被修改後,則對象就會接受到通知。
簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。
KVO的優點: 當有屬性改變,KVO會提供自動的消息通知。這樣開發人員不需要自己去實現這樣的方案:每次屬性改變了就發送消息通知。 這是KVO機制提供的最大的優點。因為這個方案已經被明確定義,獲得框架級支持,可以方便地采用。 開發人員不需要添加任何代碼,不需要設計自己的觀察者模型,直接可以在工程裡使用。 其次,KVO的架構非常的強大,可以很容易的支持多個觀察者觀察同 一個屬性,以及相關的值。
使用步驟如下: 1. 注冊,指定被觀察者的屬性 -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context keyPath就是要觀察的屬性值,options給你觀察鍵值變化的選擇,而context方便傳輸你需要的數據(注意這是一個void型) 2. 實現回調方法 -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context change裡存儲了一些變化的數據,比如變化前的數據,變化後的數據;如果注冊時context不為空,這裡context就能接收到。 是自動調用的,只要你所監聽對象的屬性或者實例變量發生變化,就自動調用該函數,執行相應操作 3. 觸發回調方法 實例理解代碼

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    NSString *kkk;
    NSMutableDictionary *xxx;
    
}
- (IBAction)btntest:(id)sender {
    [self setValue:@"222" forKey:@"kkk"];
    NSMutableDictionary *ccc = [[NSMutableDictionary alloc] init];
    [ccc setObject:@"v" forKey:@"k"];
    [self setValue:ccc forKey:@"xxx"];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    xxx = [[NSMutableDictionary alloc] init];
    [self setValue:@"111" forKey:@"kkk"];
    [self addObserver:self forKeyPath:@"kkk" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    NSMutableDictionary *zzz = [[NSMutableDictionary alloc] init];
    [self setValue:zzz forKey:@"xxx"];
    [self addObserver:self forKeyPath:@"xxx" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
}


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualToString:@"kkk"])
    {
        NSString *old = [change valueForKey:@"old"];
        NSString *new = [change valueForKey:@"new"];
        NSLog(@"old=%@,new=%@", old, new);
    }
    if([keyPath isEqualToString:@"xxx"])
    {
        NSMutableDictionary *old = [change valueForKey:@"old"];
        NSMutableDictionary *new = [change valueForKey:@"new"];
        NSLog(@"old=%ld,new=%ld,xxx=%ld", [old count], [new count], [xxx count]);
    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved