IOS Key-Value Observing (KVO)

來源:互聯網
上載者:User

標籤:

  kvo,與觀察者模式類似,通過給指定的對象設定觀察者,來檢測對象的變化,當指定的對象的屬性被修改後,用於作為觀察者的對象會接收到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,kvo就會自動通知相應的觀察者。系統架構已經支援kvo,所以在開發過程中可以直接使用,非常方便。

一、kvo的使用步驟

1、註冊,指定被觀察者的屬性

2、實現回調方法

3、移除觀察

二、通過現實中的小例子介紹一下kvo的用法

  我有一張銀行卡,只要卡內的金額發生的改變,銀行就會發簡訊給我提示,下面通過代碼使用kvo來類比一下這個過程

  先建立一個Card銀行卡類,卡裡有money金額的屬性,在初始化這張卡的時候,給卡裡金額設定一個初值1000,然後每隔1秒鐘類比消費10元,代碼如下:

  Card.h

//  Card.h//  KVO////  Created by jerei on 15-6-5.//  Copyright (c) 2015年 jerehedu. All rights reserved.//#import <Foundation/Foundation.h>@interface Card : NSObject@property (nonatomic, assign) float money;@end

  Card.m

//  Card.m//  KVO////  Created by jerei on 15-6-5.//  Copyright (c) 2015年 jerehedu. All rights reserved.//#import "Card.h"@implementation Card-(instancetype)init{    if (self = [super init]) {        _money = 1000.0;                [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeMoney) userInfo:nil repeats:YES];    }    return self;}//改變卡內金額-(void)changeMoney{    self.money -= 10;    }@end

  再建立一個People人類,在這個類中有姓名name和card銀行卡兩個屬性。

  People.h

//  People.h//  KVO////  Created by jerei on 15-6-5.//  Copyright (c) 2015年 jerehedu. All rights reserved.//#import <Foundation/Foundation.h>@class Card;@interface People : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, strong) Card *card;-(id)initWithName:(NSString *)name andCard:(Card *)card;@end

  People.m

//  People.m//  KVO////  Created by jerei on 15-6-5.//  Copyright (c) 2015年 jerehedu. All rights reserved.//#import "People.h"#import "Card.h"@implementation People-(id)initWithName:(NSString *)name andCard:(Card *)card{    if (self = [super init]) {        _name = name;        _card = card;    }        return self;}@end

  建立好了兩個類之後,在People類中通過kvo來監測銀行卡中金額的變化

1、人需要監聽銀行賬戶中的金額,需要註冊監聽對象
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

  調用方法的是被監聽的對象,參數分別為:

addObserver:觀察者

forKeyPath:被監聽的對象的屬性,屬性裡面還有屬性的,可以用點文法

options:想監聽的對象是什麼操作,比如初始化、有新的值

context:上下文,一般為nil,當KeyPath:相同時,可以用它來區分

  因此,在People.m中需要添加的代碼為:

-(id)initWithName:(NSString *)name andCard:(Card *)card{    if (self = [super init]) {        _name = name;        _card = card;           //註冊,添加觀察者        [_card addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];    }        return self;}
2、一旦註冊了,就可以去回呼函數中感知變化過程
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

observeValueForKeyPath:字串,被監聽的屬性

ofObject:哪一個對象被監聽

change:字典,包含了變化前和變化後的值

context:上下文

  因此,在People.m中需要實現回調方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    NSLog(@"回調方法 %@",change);}
3、解除監聽對象
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

  調用方法的是被監聽的對象

removeObserver:觀察者

forKeyPath:字串

  因此,在People.m中重寫dealloc方法,實現移除監聽者

-(void)dealloc{    [_card removeObserver:self forKeyPath:@"money"];}
4、ps: kvo屬性值改變時,不能直接改值

  例子中Card類中有一個changeMoney方法,在這個方法中修改了被監聽屬性的值,下面介紹4中方法給大家。

-(void)changeMoney{    //不能直接改值!!!!    _money -= 10; //錯誤的        //1.點文法    self.money -= 10;        //2. set方法    float f = _money-10;    [self setMoney:f];        //3. kvc    [self setValue:@(f) forKey:@"money"];        //4.    [self willChangeValueForKey:@"money"];    _money -= 10;    [self didChangeValueForKey:@"money"];    }

 

  如有疑問諮詢或技術交流,請加入官方QQ群: (452379712)

傑瑞教育
出處:http://www.cnblogs.com/jerehedu/ 
本文著作權歸煙台傑瑞教育科技有限公司和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。 

IOS Key-Value Observing (KVO)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.