iOS kvo 结合 FBKVOController 的使用
iOS kvo 结合 FBKVOController 的使用
一:FBKVOControlloer是FaceBook开源的一个 在 iOS,maxOS上使用 kvo的 开源库;
提供了block和@selector(SEL) 的回调操作,很方便实用;
https://github.com/facebook/KVOController
二:示例:
1 2 3 4 5 6 7 8 9 10 11 | fbKVO = [FBKVOController controllerWithObserver: self ]; [fbKVO observe:personOne keyPath:@ "pName" options: NSKeyValueObservingOptionNew block:^( id observer, id object, NSDictionary *change) { //NSLog(@"%@ %@ %@",observer,object,change); //Person *p = (Person *)object; //self.title = p.pName; self .title = change[ NSKeyValueChangeNewKey ]; }]; |
三:流程操作
1:创建 Person Object
1 2 3 4 5 6 7 | #import <Foundation/Foundation.h> @interface Person : NSObject @property ( nonatomic ,strong) NSString *pName; @end |
2: 下载FBKVOController---导入FBKVOController.h .m文件 ARC环境
1 2 | #import "FBKVOController.h" #import "Person.h" |
3:创建Person对象(被观察者),及FBKVOController对象(管理观察者与被观察者);
1 2 3 4 5 | @interface RootViewController () { Person *personOne; FBKVOController *fbKVO; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | - ( void )viewDidLoad { [ super viewDidLoad]; self .title = @ "TEST" ; listArray = [[ NSMutableArray alloc]initWithCapacity:5]; [listArray addObject:@ "FBKVOController" ]; personOne = [[Person alloc]init]; personOne.pName = @ "defaultName" ; fbKVO = [FBKVOController controllerWithObserver: self ]; [fbKVO observe:personOne keyPath:@ "pName" options: NSKeyValueObservingOptionNew block:^( id observer, id object, NSDictionary *change) { //NSLog(@"%@ %@ %@",observer,object,change); //Person *p = (Person *)object; //self.title = p.pName; self .title = change[ NSKeyValueChangeNewKey ]; }]; /** 一:kvo值检测类型; 1: NSKeyValueObservingOptionNew 传递变化之后的值; 2: NSKeyValueObservingOptionOld 传递变化之前的值; 3: NSKeyValueObservingOptionInitial 观察者会在程序初始时,也就是观察变化之前,优化执行一次 观察动作;即上述执行上面 block操作一次;并且传递 默认的值,和以后传递 变化后的值; 4: NSKeyValueObservingOptionPrior 会调用两次观察者操作,值改变之前,值改变之后; 二:获取 kvo的值; change[NSKeyValueChangeNewKey] 新值; change[NSKeyValueChangeOldKey] 旧值; */ } |
4:添加改变 被观察者 Person的pName属性值变化操作,然后在 观察者观察到 pName值发生变化时,改变 self.title的值
1 2 3 4 5 6 7 8 9 10 11 | #pragma mark action 点击 - ( void )tableView:(UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated: YES ]; int nums = arc4random()%10; personOne.pName = [ NSString stringWithFormat:@ "newName%d" ,nums]; NSLog (@ "new --> %@" ,personOne.pName); } |
//在 pName属性值发生变化时,改变self.title的值;
1 2 3 4 5 6 7 8 9 10 | [fbKVO observe:personOne keyPath:@ "pName" options: NSKeyValueObservingOptionNew block:^( id observer, id object, NSDictionary *change) { //NSLog(@"%@ %@ %@",observer,object,change); //Person *p = (Person *)object; //self.title = p.pName; self .title = change[ NSKeyValueChangeNewKey ]; }]; |
5:如果想移除观察者:
1 2 3 4 | //三种方式任你选择; [fbKVO unobserve:personOne]; [fbKVO unobserve:personOne keyPath:@ "pName" ]; [fbKVO unobserveAll]; |
6: 效果:
改变值之前
改变值之后
分类:
OC
标签:
FBKVOController
, kvo
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具