大前端开发

oc 利用block实现链式调用

2019-05-16  本文已影响8人  c5b9f0203861

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

作为一个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还有很多强大的功能,以后再写。

上一篇 下一篇

猜你喜欢

热点阅读