工作记录,加深记忆,方便以后查询。
作为一个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还有很多强大的功能,以后再写。
网友评论