国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

IOSKey-ValueObserving(KVO)

2019-11-14 18:50:47
字體:
來源:轉載
供稿:網友

  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群:JRedu技術交流 (452379712)

作者:杰瑞教育
出處:http://m.survivalescaperooms.com/jerehedu/ 
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 图片| 龙州县| 综艺| 金华市| 海宁市| 罗田县| 阿勒泰市| 繁昌县| 通海县| 平山县| 铜鼓县| 丽水市| 邵武市| 双峰县| 辽宁省| 兴城市| 呼玛县| 桂阳县| 南昌县| 铁岭市| 腾冲县| 田阳县| 双柏县| 昭平县| 二手房| 平远县| 富平县| 大埔区| 中阳县| 湘阴县| 井陉县| 读书| 皮山县| 松原市| 河曲县| 正蓝旗| 无极县| 贵溪市| 师宗县| 汝南县| 汪清县|