链式编程思想
链式编程思想: 是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
代表:masonry框架。
@interface JiSuanQiManager : NSObject
@property (nonatomic, assign) NSInteger result;
- (JiSuanQiManager *(^)(NSInteger))add;
@end
#import "JiSuanQiManager.h"
@implementation JiSuanQiManager
- (JiSuanQiManager * (^)(NSInteger))add
{
return ^(NSInteger value){
_result += value;
return self;
};
}
@end
JiSuanQiManager *mgr = [[JiSuanQiManager alloc] init];
mgr.add(5).add(5).add(7).add(8);
NSLog(@"%ld",mgr.result);
响应式编程思想
响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
代表:KVO运用。
KVO的实现
#import <Foundation/Foundation.h>
@interface NSObject (KVO)
- (void)xmg_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:( void *)context;
@end
#import "NSObject+KVO.h"
#import <objc/message.h>
@implementation NSObject (KVO)
- (void)xmg_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
{
/*
1.runtime动态生成Person的子类(派生类)
2.重写KVO_Person的属性set方法,目的:监听属性有没有改变
3.修改对象的isa指针.
*/
// 修改isa
object_setClass(self, NSClassFromString(@"NSKVONotifying_Person"));
// 保存观察者对象
// self -> P;
// 动态添加属性
objc_setAssociatedObject(self, "observer", observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
#import "Person.h"
@interface NSKVONotifying_Person : Person
@end
#import "NSKVONotifying_Person.h"
#import <objc/message.h>
@implementation NSKVONotifying_Person
- (void)setAge:(NSInteger)age
{
// super:标志,去执行父类方法
[super setAge:age];
// 调用观察者的observeValueForKeyPath
id observer = objc_getAssociatedObject(self, "observer");
[observer observeValueForKeyPath:@"age" ofObject:self change:nil context:nil];
NSLog(@"执行NSKVONotifying_Person");
// NSLog(@"%@",[super class]);
}
@end
函数式编程思想
函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)
代表:ReactiveCocoa
@interface JiSuanQiManager : NSObject
@property (nonatomic, assign) NSInteger result;
- (void)add:(NSInteger)value;
- (void)sub:(NSInteger)value;
- (JiSuanQiManager *)jisuan:(NSInteger(^)(NSInteger))block;
- (JiSuanQiManager *)log;
- (BOOL)equle:(NSInteger)value;
@end
#import "JiSuanQiManager.h"
@implementation JiSuanQiManager
- (JiSuanQiManager *)jisuan:(NSInteger (^)(NSInteger))block
{
_result = block(_result);
return self;
}
- (JiSuanQiManager *)log
{
NSLog(@"%ld",_result);
return self;
}
- (BOOL)equle:(NSInteger)value
{
return _result == value;
}
@end
JiSuanQiManager *mgr = [[JiSuanQiManager alloc] init];
BOOL isReal = [[mgr jisuan:^(NSInteger reslut){
// 计算的代码 写在这里面
reslut+=5;
reslut+=5;
reslut+=5;
reslut+=5;
return reslut;
}] equle:20];
NSLog(@"%d",isReal);
网友评论