响应式编程思想(一)
来源:互联网 发布:辨别颜色软件 编辑:程序博客网 时间:2024/05/17 23:13
以KVO为例做了一个简单的响应式编程demo,特此记。
KVO的底层实现就是监听属性值set方法的改变。
需要创建一下几个文件。
Person
Person.h
#import <Foundation/Foundation.h>@interface Person : NSObject/** age */@property(nonatomic,assign)NSInteger age;@end
Person.m
#import "Person.h"@implementation Person@end
KVO_Person
KVO_Person.h
#import "Person.h"@interface KVO_Person : Person@end
KVO_Person.m
#import "KVO_Person.h"#import "NSObject+zw_Kvo.h"#import <objc/runtime.h>@implementation KVO_Person-(void)setAge:(NSInteger)age{ [super setAge:age]; //发通知 id obsver = objc_getAssociatedObject(self, @"obsever"); id keypath = objc_getAssociatedObject(self, @"keyPath"); [obsver observeValueForKeyPath:keypath ofObject:nil change:nil context:nil];}@end
NSObject+zw_Kvo
NSObject+zw_Kvo.h
#import <Foundation/Foundation.h>@interface NSObject (zw_Kvo)- (void)zw_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;@end
NSObject+zw_Kvo.m
#import "NSObject+zw_Kvo.h"#import "KVO_Person.h"#import <objc/runtime.h>@implementation NSObject (zw_Kvo)- (void)zw_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context{ //修改对象指针 object_setClass(self, [KVO_Person class]); //保存可以 objc_setAssociatedObject(self, @"obsever", observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); objc_setAssociatedObject(self, @"keyPath", keyPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}@end
ZWKVOViewController
ZWKVOViewController.m
#import "ZWKVOViewController.h"#import "Person.h"#import "NSObject+zw_Kvo.h"@interface ZWKVOViewController ()@property(nonatomic,strong) Person *person;@end@implementation ZWKVOViewController- (void)viewDidLoad { [super viewDidLoad]; self.title = @"响应式编程实现KVO"; [self method2];}-(void)method2{ //实现KVO 就是监听set方法 Person *person = [[Person alloc]init]; [person zw_addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil]; self.person = person;}-(void)method1{ //实现KVO 就是监听set方法 Person *person = [[Person alloc]init]; [person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil]; self.person = person;}-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSLog(@"age==>");}-(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.person removeObserver:self forKeyPath:@"age"];}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.person.age ++;}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
0 0
- 响应式编程思想(一)
- 【Scala】响应式编程思想
- 函数响应式编程(FRP)思想
- 几种编程思想(链式编程、响应式编程、函数式编程)
- 俄罗斯方块编程思想一
- java编程思想(一)
- 一、Rxjava从头学:响应式编程
- Masonry链式编程思想的基本思路以及KVO底层的响应式编程
- JAVA编程思想读书笔记一:
- 《JAVA编程思想》(一)
- java编程思想(一)
- java 编程思想 书摘一
- Java编程思想[一]对象
- retrofit与响应式编程一:rxjava简介
- RxJava入门篇 --(一) 响应式编程
- 响应式编程--Android Rxjava的使用(一)
- Android之RxJava函数响应式编程(一)基本用法
- 响应式编程:理解响应式编程
- R note(3)
- android 编辑框获取软键盘后 将底部控件顶上来解决办法
- iOS 开发中的 GCD 详细使用
- 自定义对话框
- Angular的Table 组件
- 响应式编程思想(一)
- IOS-下载地址&评价地址
- leetcode No6. ZigZag Conversion
- 【QTP】获取WinListView表中所有信息
- git补丁应用git apply *.patch
- B001-Atmega16-中断(GCC-AVR)-(ques=3)
- maven项目报错:cvc-elt.1: Cannot find the declaration of element 'beans'.
- ios 内存使用陷阱
- git图解。通俗易懂