0%

构建更灵活的生产流程(下)

五、不同层次的定制能力

作为组件的提供商,需求方对于组件定制有不同的诉求,从小到大分大致可以拆分为:按钮颜色的定制、图标替换、字体大小的定制;布局逻辑的定制;数据源定制;小组件替换;页面替换。

不同的诉求应该用不同的方案解决,成本低的方案不灵活,灵活的方案成本高(代码多),做组件化接入时最考验的就是眼力见,对将来的定制化诉求做出提前预估,需要警惕过度设计(over-designed)。这时候需要两个人:一个能凑合用先凑合用的人、持续维护过程中不断被坑的人,使得两者达到力量的完美平衡(和谐)方成大道(大误)

5.1 按钮颜色的定制、图标替换、字体大小的定制

一套 UI 代码在 N 个不同的 App 中被集成的时候一定会遇到定制具体色值的问题。这种多 App 的场景的特点在于不同的 App 有自己的色值规范,红色、橙色、蓝色之间有不同色彩定义。为了减少代码的使用,可以考虑使用全局变量+宏定义的形式。

1
2
3
4
@interface ColorDefine : NSObject
+ (UIColor *)cellBackgroundColor;
+ (UIColor *)cellBorderColor;
@end

在 initialize 的时候根据宏定义初始化不同的颜色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#import "ColorDefine.h"

static UIColor *_cellBackgroundColor = nil;
static UIColor *_cellBorderColor = nil;

@implementation ColorDefine

+ (void)initialize {
if(self == [ColorDefine class]) {
#ifdef AppA
[ColorDefine resetAppA];
#else
[ColorDefine resetAppB];
#endif
}
}

+ (void)resetAppA {
_cellBackgroundColor = [UIColor redColor];
_cellBorderColor = [UIColor redColor];
}

+ (void)resetAppB {
_cellBackgroundColor = [UIColor grayColor];
_cellBorderColor = [UIColor lightGrayColor];
}

+ (UIColor *)cellBackgroundColor {
return _cellBackgroundColor;
}

+ (UIColor *)cellBorderColor {
return _cellBorderColor;
}

@end

UIAppearance

也可以使用 UIAppearance 的形式来解决

5.2 布局逻辑的定制

当一个页面在不同情况下需要展示成不同的样式。如下图,子组件数量、样式基本一致,只有布局和部分细节不同。

可以考虑抽象出基类,提供默认的布局方式,同时将需要被布局的子控件以属性的形式暴露出去,子类继承时直接访问自控件就能够达到修改布局的目的

5.3 数据源的替换

作为组件的提供方,不同接入方都会提出期望自己的数据不同于其他业务。比方说在编辑的场景中的贴纸列表,在不同的 app 从网络请求接口到内部实现细节都会不一样。

这种解决思路就是:依赖注入。这里推荐一个框架objection

六、Service 共享基础设施

七、session 生命周期管理

1
2
3
4
5
[[KSProductionSessionManager shareManager] retainSession:self];
__weak typeof(self) weakSession = self;
[vc kspm_addDeallocBlock:^{
[[KSProductionSessionManager shareManager] releaseSession:weakSession];
}];

session 生命周期比较长,不应该被任何对象持有(所有的引用都应该是 weak),建议使用KSProductionSessionManager 显式 retain 、release 保证 session 的生命周期