日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS Key-Value Observing (KVO)

發布時間:2024/4/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS Key-Value Observing (KVO) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  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/?
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

轉載于:https://www.cnblogs.com/jerehedu/p/4580088.html

總結

以上是生活随笔為你收集整理的IOS Key-Value Observing (KVO)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。