
作者:akon
原文地址:https://xiaozhuanlan.com/topic/7986120534
组件化
作用
组件化的作用是模块解耦、代码复用。
方案
MGJRouter
MGJRouter通过注册url的方式来实现方法注册和调用
1、组件提供方通过registerURLPattern注册方法。
[MGJRouter registerURLPattern:@"mgj://category/travel" toHandler:^(NSDictionary *routerParameters) {
NSLog(@"routerParameters[MGJRouterParameterUserInfo]:%@", routerParameters[MGJRouterParameterUserInfo]);
// @{@"user_id": @1900}
}];
2、调用方通过openURL调用组件提供的方法。
[MGJRouter openURL:@"mgj://category/travel" withUserInfo:@{@"user_id": @1900} completion:nil];
该种方案的缺点有:
- 组件每提供一个方法,需要提供一个url,组件多的话url肯定会很多,需要有一个地方统一管理,比较难维护。
- 参数传入不能直接传model,而是需要传字典,如果方法实现方修改一个字段的类型但没有通知调用方,调用方无法直接知道,有可能导致崩溃。
- 通过字典传参不直观,调用方需要知道字段的名字才能获取字段值,如果字段名不定义为宏,到处拷贝字段名造成难以维护。
CTMediator
CTMediator通过CTMediator的类别来实现方法调用。
1、组件提供方实现Target、Action。
@interface Target_A : NSObject
- (UIViewController *)Action_nativeFetchDetailViewController:(NSDictionary *)params;
@end
- (UIViewController *)Action_nativeFetchDetailViewController:(NSDictionary *)params
{
// 因为action是从属于ModuleA的,所以action直接可以使用ModuleA里的所有声明
DemoModuleADetailViewController *viewController = [[DemoModuleADetailViewController alloc] init];
viewController.valueLabel.text = params[@"key"];
return viewController;
}
2、组件提供方实现CTMediator类别暴露接口给使用方。
@interface CTMediator (CTMediatorModuleAActions)
- (UIViewController *)CTMediator_viewControllerForDetail;
@end
- (UIViewController *)CTMediator_viewControllerForDetail
{
UIViewController *viewController = [self performTarget:kCTMediatorTargetA
action:kCTMediatorActionNativFetchDetailViewController
params:@{@"key":@"value"}
shouldCacheTarget:NO
];
if ([viewController isKindOfClass:[UIViewController class]]) {
// view controller 交付出去之后,可以由外界选择是push还是present
return viewController;
} else {
// 这里处理异常场景,具体如何处理取决于产品
return [[UIViewController alloc] init];
}
}
3、组件调用方通过引入CTMediator (CTMediatorModuleAActions)来调用组件的接口
#import "CTMediator +CTMediatorModuleAActions.h"
UIViewController* vc = [[CTMediator sharedInstance] CTMediator_viewControllerForDetail];
此种方案的优点是通过Targrt-Action实现了组件之间的解耦,通过暴露方法给组件使用方,避免了url直接传递字典带来的问题。
缺点是:
- CTMediator类别实现由于需要通过performTarget方式来实现,需要写一堆方法名、方法参数名字字符串,影响阅读,难以维护;
- 没有组件管理器概念。组件之间的互相调用都是通过直接引用CTMediator类别来实现,没有实现真正的解耦;并且类别暴露了方法的具体实现
BeeHive
BeeHive通过url来实现页面路由,通过Protocol来实现方法调用。
一、组件提供方注册service
[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];
二、组件调用方调用service
id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];
// use homeVc do invocation
笔者强烈推荐使用BeeHive这种方式来做组件化,基于Protocol(面向接口)来实现组件化有如下优点:
- 通过提供接口给调用方,向调用方隐藏了实现,后面如果实现改变了,对调用方也是透明的。
- 能让组件提供方清晰地提供接口声明给使用方。
- 能充分利用编辑器特性,比如如果接口删除了一个参数,能通过编译器编不过来告诉调用方接口发生了变化。
组件管理与发布
可以采用私有pod库来管理。笔者采用的是私有远程pod+本地pod结合来管理的
资料推荐
如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

网友评论