1.开发疑惑和想要的结果
在项目开发中,如果遇到多参数传递可能会出现如下问题:
参数不同导致方法不同
写完第一个头像加载方法后,因为没有考虑到头像边框和边框颜色的问题导致加入第二个和第四个头像加载方法,这样就会使之后的开发会因为选择使用哪一个方法而产生困惑。
使用链式编程的思想,将参数以block的形式连接起来就可以解决上述的疑惑
[self.avatarView hj_makeAvatarWithAttribute:^(HJAvatarAttribute *attribute) {
attribute.imageURL(avatarURL);
attribute.avatarSize(CGSizeMake(50, 50));
attribute.borderColor([UIColor redColor]).borderWidth(1).radius(25);
}];
这样不仅调用简单,而且可以很清楚的看到传递了什么参数。
2.代码实现片段
@interface HJAvatarAttribute : NSObject
.....
@property (nonatomic, strong) NSURL *imageURLA;
@property (nonatomic, copy) HJAvatarAttribute *(^imageURL)(NSURL *imageURL);
....
+ (instancetype)defauleAttribute;
@end
@interface HJAvatarView : UIView
- (void)hj_makeAvatarWithAttribute:(void (^)(HJAvatarAttribute *attribute))attributeBlock;
@end
@implementation HJAvatarAttribute
+ (instancetype)defauleAttribute
{
HJAvatarAttribute *attribute = [HJAvatarAttribute new];
attribute.borderWidthA = 1;
....
return attribute;
}
- (HJAvatarAttribute *(^)(NSURL *))imageURL
{
return ^(NSURL *imageURL) {
self.imageURLA = imageURL;
return self;
};
}
.....
@end
@implementation HJAvatarView
- (void)hj_makeAvatarWithAttribute:(void (^)(HJAvatarAttribute *))attributeBlock
{
attributeBlock(self.defaultAttribute);
[self.avatarView setImageWithURL:self.defaultAttribute.imageURLA ....];
}
// 使用默认配置进行初始化操作,在用户没有配置参数时,使用默认参数代替
- (HJAvatarAttribute *)defaultAttribute
{
if (!_defaultAttribute) {
_defaultAttribute = [HJAvatarAttribute defauleAttribute];
}
return _defaultAttribute;
}
@end
这里要注意的就是在HJAvatarAttribute中,为了达到链接的效果,属性必须要返回当前HJAvatarAttribute *
的实例,并且可以传递参数进去,这样很自然的就想到使用block进行实现。
在调用hj_makeAvatarWithAttribute
方法时,将实例化后的HJAvatarAttribute *
属性以block形式,传给方法调用者进行赋值操作。
代码实现细节可以查看 我的github
网友评论