Object-C OC 实现链式调用.

最近写了个关于sqlite3的代码, 突发奇想, 想用一用用链式反应.
发现用起来还是很不错的, 参考Mosonry的使用.

关于 iOS sqlite 的文章.

之前在使用 swift 时用过, 也搞过链式调用. 但是, 在工作中, 使用 swift 本身就比较少. 所以搞了也一直没怎么用过.
这次搞自己的东西, 终于有机会正式的用一用了.

在 OC 中, 链式调用的实现, 怎么看要比swfit中的实现简单很多.

  • 要看swift响应式反应的请看这里. 牛人写的文章.

实现

原理
  1. 基本

基本的原理, 是通过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;
  1. 可传参数

可传参数实质上是实现了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);
  1. 可回调

本质上与 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, 其他任意对象, 也可以是其他可链式式反应的对象.

这点代码就不上传了, 几行而已!

你可能感兴趣的:(Object-C OC 实现链式调用.)