美文网首页大前端开发
oc 利用block实现链式调用

oc 利用block实现链式调用

作者: shihh999 | 来源:发表于2019-05-16 16:58 被阅读8次

    工作记录,加深记忆,方便以后查询。

    作为一个iOS开发者,都知道它的常规方法调用是通过中括号[a f:b]。

    有时候需要在外部设置很多的参数,这样用传统的方式可能不是很好看,要写很多的中括号调用。

    ///.h

    @interface Test : NSObject

    - (void)value1:(NSString*)v1;

    - (void)value2:(BOOL)v2;

    - (void)value3:(NSInteger)v3;

    @end

    /////.m

    @implementation Test

    {

        NSString*    mV1;

        BOOL           mV2;

        NSInteger   mV3;

    }

    - (void)value1:(NSString*)v1{

        mV1 = v1;

    }

    - (void)value2:(BOOL)v2; {

        mV2 = v2;

    }

       - (void)value3:(NSInteger)v3{

        mV3 = v3;

    }

    @end

    在Test调用时,需要像下面这样调用

    Test* test = [Test new];

    [test value1:@"value"];

    [test value2:true];

    [test value3:1]

    上面是传统的OC调用方式,但是在一个对象需要设置很多配置项时,这样调用就显得比较笨重了,或者说看着没有那么优雅。

    现在有很多开发者喜欢用出代码来实现自动布局,那么肯定对masonry很熟悉了,它的调用方式就不是传统的OC调用方式,而是使用的链式调用,java开发者可能比较熟悉,通过点把方法连接起来。

    make.left.equalTo(@0).right.equalTo(@0);

    用这种方式来调用上面Test 方法,就是下面这周写法

    test.value1(@"value").value2(true).value3(1)...............

    那么OC是通过什么来实现链式调用呢,就是传说中的block。一般的block都是用来做回调用的。来看看它是怎么帮助我们实现链式调用的。

    主要就是方法的参数返回,可以返回一个block,block再把对象实例返回回来,就可以达到这个目的。看起来起来可能抽象,把上面的方法调用写成链式的可能会比较容易理解。

    ///.h

    @interface Test : NSObject

    - (Test*(^)(NSString* v1))value1;

    - (Test*(^)(BOOL v2))value2;

    - (Test*(^)(NSInteger v3))value3;

    @end

    /////.m

    @implementation Test

    {

        ............

    }

    - (Test*(^)(NSString* v1))value1{

      @weakify(self)  

       return ^(NSString* v1){

           @strongify(self)

            mV1 = v1;

            return self;

        }

    }

    - (Test*(^)(BOOL v2))value2{

    @weakify(self) 

    return ^(BOOL v2){

         @strongify(self)

           mV2 = v2;

           return self;

        }

    }

    - (Test*(^)(NSInteger v3))value3{

    @weakify(self) 

    return ^(NSInteger v3){

             @strongify(self)

            mV3 = v3;

            return self;

        }

    }

    @end

    在外部调用的时候就可以使用链式调用

    Test* test = [Test new];

    test.value1(@"value").value2(true).value3(1);

    而我习惯写一个类方法在内部创建实例

     + (Test*(^)(void))create{

        return ^(void){

            return [Test new];

        }

    }

    /////外部使用的时候

    Test.create().value1(@"value").value2(true).value3(1);

    这就是利用block实现链式调用,在实际的开发项目中,发起网络请求的时候需要设置很多参数,例如:url、params、loading、sign、get/post/form、response class等等,这个时候用链式调用设置这些参数会显得发长的方便。

    上面只是block一个简单的使用,block还有很多强大的功能,以后再写。

    相关文章

      网友评论

        本文标题:oc 利用block实现链式调用

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