-
前言
前段时间ios小组一起做项目的模块化,目前项目主要有四个业务模块(有固定的四个小小队维护)和一个底层(包括网络请求库,数据库,公共组件类别等)。但是工作进行中发现,各业务模块出现平行调用,造成相互依赖。为了解决此问题,需要开发一个数据中心DataCenter的组件来剪断各业务模块间的依赖,DataCenter属于底层Core,业务模块只能依赖底层,不能依赖其他业务模块。
-
流程图
- 定义协议BFDataCenterDelegate,所有DataSource需要继承该协议。
/**
各模块DataSources需要实现
*/
@protocol BFDataCenterDelegate <NSObject>
@optional
/**
获取数据列表
@param order 操作命令
*/
+ (void)doGetListWithOrder:(BFDCCommonOrder *)order;
/**
获取详情
@param order 操作命令
*/
+ (void)doGetDetailWithOrder:(BFDCCommonOrder *)order;
@end
2.创建DataSource,编写需要对外提供的服务。
@interface BFAuctionDataSource ()<BFDataCenterDelegate>
@end
@implementation BFAuctionDataSource
+ (void)load {
// 注册
[BFDataCenter registerDataSourceURLPattern:URL_AUCTION_CENTER dataSourceClass:[self class]];
}
+ (void)doGetListWithOrder:(BFDCCommonOrder *)order {
...doSomething
if ( order.resultBlock ) {
order.resultBlock(resultData);
order.resultBlock = nil;
}
}
@end
BFDCCommonOrder包含resourceName(子服务名),parameters(参数),resultBlock(回调)。
3.DataCenter调用对应DataSource服务
NSString *pattern = targetOrder.modulesURL;
Class dataSourceClass = [[self class] findViewObjectClassWithURLPattern:pattern];
if ( [dataSourceClass respondsToSelector:@selector(doGetListWithOrder:)] ) {
[dataSourceClass doGetListWithOrder:targetOrder];
}
此处可以定义了一个ViewObject类统一做处理返回数据加工。
4.调用测试
[[BFDataCenter sharedInstance] fetchList:^(BFDCCommonOrder *order) {
order.modulesURL = URL_AUCTION_CENTER;
order.resourceName = URL_AUCTION_DATASOURCE_GETLIST;
order.parameters = @{@"pageNum":@(0),@"pageSize":@(10),@"type":@2};
} asResult:^(BFDSResult *result) {
NSLog(@"test result : %@",result.data);
} asError:^(BFDSError *error) {
[BFCustomHUD showInfoWithStatus:error.errmsg];
}];
现在模块间的调用是不是简洁清晰多了,各业务只需要依赖DataCenter,不需要依赖其他模块任何文件就可以做到调用其他业务模块的服务。
总结
datacenter作用.png从上图中的箭头表示依赖关系走向,优化前,各业务间平行依赖,相当混乱,简直是无法直视。经过DataCenter优化后,依赖关系就十分清晰,各业务只依赖底层Core。
这次模块化工作我们用cocoaPods管理,每个业务模块都是一个单独的私有库,而且只有对应的开发团队有修改权限,各业务独立开发互不干扰。任何一个业务模块与底层都能组装成一个单独的app,如果你觉得编译太慢,那么你可以在Podfile文件中注释掉另外的模块,由于模块间已经不存在平行依赖,编译完全不受影响。
网友评论