最近写了个关于sqlite3的代码, 突发奇想, 想用一用用链式反应.
发现用起来还是很不错的, 参考Mosonry的使用.
之前在使用 swift 时用过, 也搞过链式调用. 但是, 在工作中, 使用 swift 本身就比较少. 所以搞了也一直没怎么用过.
这次搞自己的东西, 终于有机会正式的用一用了.
在 OC 中, 链式调用的实现, 怎么看要比swfit中的实现简单很多.
- 要看swift响应式反应的请看这里. 牛人写的文章.
实现
原理
- 基本
基本的原理, 是通过getter方法实现. getter的实现, 使可以通过 . 语法调用方法.
实现一个getter 返回一个可以继续调用getter的对象.
基本形式:
- (ChainAble *)onCall {
return (ChainAble *)obj;
}
- 例:
@interface Chain : NSObject
- (Chain *)onCall;
@end
@implementation Chain
- (Chain *)onCall {
return self;
}
@end
Chain *chain = [[Chain alloc] init];
// 通 . 的方法调用getter
chain.onCall;
- 可传参数
可传参数实质上是实现了block的getter.
block的类型大概是:
- ChainAble *(^)(Paramter);
getter 形式:
- (ChainAble *(^)(Paramter))onArgs {
// 返回值, 是block的实现.
return ^(Paramter) {
// 对参数 Paramter 做一些事情
return (ChainAble *)obj;
}
}
- 例:
// 实现
@interface Chain : NSObject
- (Chain *)onCall;
- (Chain *(^)(int))onArgs;
@end
@implementation Chain
- (Chain *)onCall {
return self;
}
- (Chain *(^)(int))onArgs {
return ^(int i) {
NSLog(@"%d", i);
return self;
};
}
@end
// 使用
Chain *chain = [[Chain alloc] init];
int i = 0;
chain.onCall.onArgs(1);
chain.onArgs(i);
- 可回调
本质上与 2. 中的实现是一样. 只不过在block的参数, 传入了另外一个block.
- 例:
// 实现
@interface Chain : NSObject
- (Chain *)onCall;
- (Chain *(^)(int))onArgs;
- (Chain *(^)(int, void(^)(void)))onBack;
@end
@implementation Chain
- (Chain *)onCall {
return self;
}
- (Chain *(^)(int))onArgs {
return ^(int i) {
NSLog(@"%d", i);
return self;
};
}
- (Chain *(^)(int, void(^)(void)))onBack {
return ^(int i, void(^block)(void)) {
NSLog(@"%d", i);
if (block) {
block();
}
return self;
};
}
@end
// 使用
Chain *chain = [[Chain alloc] init];
int i = 0;
chain.onBack(i, ^(){
NSLog(@"chain callback!");
});
特别地!
getter 无论是直接返回, 还是在block中返回的对象并非一定是self. 也可以是void, 其他任意对象, 也可以是其他可链式式反应的对象.