美文网首页
Block实现链式编程(iOS)

Block实现链式编程(iOS)

作者: kakukeme | 来源:发表于2016-10-14 17:13 被阅读37次

    参考链接

    使用场景:对象调用了一个方法想继续再调用另一个方法

    方案1.

    直接调用两次

    Person *p = [[Person alloc] init];
    [p run];
    [p study];
    

    方案2

    在方法中返回对象本身,来连续调用,代码相对简洁

    - (Person *)study
    {
        NSLog(@"study----");
        return self;
    }
    - (Person *)run
    {
        NSLog(@"run----");
        return self;
    }
    
    

    调用效果

    Person *p = [[Person alloc] init];
    [[p run] study];
    [[[[p run] study] run] study];
    

    方案3

    block链式,上个方案还是不简洁,于是有了Block实现链式编程

    - (Person *(^)())study
    {
        return ^(){
            NSLog(@"study---");
            return self;
        };
    }
    
    - (Person *(^)())run
    {
        return ^{
            NSLog(@"run----");
            return self;
        };
    }
    
    

    让对象方法返回block,block被调用再返回对象本身,就可以实现如下调用效果

    Person *p = [[Person alloc] init]; p.study().run().study();

    p.study()实际分为了两步,先用p.study得到了block,再用括号()调用了block;调用了block又返回对象本身,于是就可以继续调用方法。

    如果想传参数,使用:冒号方式定义方法,将不能实现p.study(@"iOS").run().study(@"iOS")形式的链式

    - (Person *(^)())study:(NSString *)name
    {
        return ^(){
            NSLog(@"study----%@", name);
            return self;
        };
    }
    

    只能实现[[p study:@"iOS"]().run() study:@"iOS"]()的形式,这并不是我们想要的,代码不简洁,可读性也不好。

    所以传参数要传给block

    - (Person *(^)(NSString *))study
    {
        return ^(NSString *name){
            NSLog(@"study----%@", name);
            return self;
        };
    }
    

    于是就能

    p.study(@"iOS").run().study(@"链式编程");
    

    总结:
    实现链式编程,让对象方法返回block,block被调用再返回对象本身;想传参数,要将参数传给block,不能使用:冒号方式定义方法。

    相关文章

      网友评论

          本文标题:Block实现链式编程(iOS)

          本文链接:https://www.haomeiwen.com/subject/aaxnyttx.html