博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KVO
阅读量:4983 次
发布时间:2019-06-12

本文共 2088 字,大约阅读时间需要 6 分钟。

/*KVO 键值观察对象和对象之间传递消息

 

 一,概述

 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

 二,使用方法

 系统框架已经支持KVO,所以程序员在使用的时候非常简单。

 1. 注册,指定被观察者的属性,

 2. 实现回调方法

 3. 移除观察*/

 

//person类

#import <Foundation/Foundation.h>

#import "BankCount.h"

@interface Person : NSObject

{

    BankCount *aBankCount;

}

- (void)registerABankCount;//打开监听银行账号的能力

@end

 

#import "Person.h"

 

@implementation Person

- (id)init

{

    if (self = [super init]) {

        

        aBankCount = [[BankCountalloc] init];

    }

    returnself;

}

// Yu_e指向自己的指针

static void *Yu_e = (void *)&Yu_e;

- (void)registerABankCount

{

    //监听银行账号的变化过程

    [aBankCountaddObserver:selfforKeyPath:@"yu_e"options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOldcontext:Yu_e];

    //移除监听

    //[self removeObserver:object forKeyPath:@"yu_e"];

    //给aBankCount增加一个监听者 self, 去监听:yu_e

    //只要yu_e有变化就会让self知道

}

//监听的回调函数

//只要aBankCount的yu_e有变化就会调用

//keyPath就是之前监听的yu_e

//object就是aBankCount

//change是一个字典里边包含了新、旧值

//context是一个私有变量Yu_e

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    if (context == Yu_e) {

        NSString *str = [change objectForKey:NSKeyValueChangeNewKey];

        NSLog(@"str = %@",str);

    }

    else

    {

        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

    }

}

 

//BankCount类

#import <Foundation/Foundation.h>

 

@interface BankCount : NSObject

 

@property (nonatomic, assign) float yu_e;

@end

 

#import "BankCount.h"

 

@implementation BankCount

- (id)init

{

    self = [super init];

    if (self) {

        [NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(yu_eUpdate:) userInfo:nilrepeats:YES];

    }

    returnself;

}

- (void)yu_eUpdate:(id)arg

{

    float f = self.yu_e;

    f += arc4random() % 100;

    self.yu_e = f;//1、不能_yu_e = f;

    

    [self setYu_e:f];//2、

    

    [selfsetValue:[NSNumbernumberWithFloat:f] forKey:@"yu_e"];//3、

    

    [selfwillChangeValueForKey:@"yu_e"];//4、

    _yu_e = f;

    [selfdidChangeValueForKey:@"yu_e"];

}

@end

 

//调用

Person *p = [[Person alloc] init];

[p registerABankCount];

[[NSRunLoop currentRunLoop] run];

 

转载于:https://www.cnblogs.com/chenhaosuibi/p/3442536.html

你可能感兴趣的文章
sql查询单个银行账号重复
查看>>
git命令集合
查看>>
Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
查看>>
jackson json转list
查看>>
浅谈人人网以及淘宝网的IM即时通信以及消息推送
查看>>
[转] 获取刚插入的数据的自增列ID——IDSCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别(比较)...
查看>>
IDEA使用总结
查看>>
markdown 一个优雅的写作工具
查看>>
poj1064 Cable master(二分查找,精度)
查看>>
Python 基础篇:编码、变量、模块
查看>>
关于Intellij IDEA导入jdk出现异常
查看>>
HLS切片机
查看>>
单链表的反转
查看>>
习题3.5 求链表的倒数第m个元素(20 分)浙大版《数据结构(第2版)》题目集...
查看>>
1102. Invert a Binary Tree (25)
查看>>
MySQL 索引详解
查看>>
LinkedList,ArrayList末尾插入谁效率高?
查看>>
Spring-MVC理解之一:应用上下文webApplicationContext
查看>>
[LeetCode] IP to CIDR 将IP地址转为CIDR无类别域间路由
查看>>
bbs
查看>>