美文网首页iOS Developer
解决项目中模块间的平行依赖

解决项目中模块间的平行依赖

作者: 东篱先生_ | 来源:发表于2017-05-03 17:37 被阅读0次
    • 前言

    前段时间ios小组一起做项目的模块化,目前项目主要有四个业务模块(有固定的四个小小队维护)和一个底层(包括网络请求库,数据库,公共组件类别等)。但是工作进行中发现,各业务模块出现平行调用,造成相互依赖。为了解决此问题,需要开发一个数据中心DataCenter的组件来剪断各业务模块间的依赖,DataCenter属于底层Core,业务模块只能依赖底层,不能依赖其他业务模块。

    • 流程图
    DataCenter原理图.png
    1. 定义协议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文件中注释掉另外的模块,由于模块间已经不存在平行依赖,编译完全不受影响。

    相关文章

      网友评论

        本文标题:解决项目中模块间的平行依赖

        本文链接:https://www.haomeiwen.com/subject/kkaizttx.html