iOS项目模块化拆分

2020-12-11  本文已影响0人  智人一千

简介

本次拆分是今年某次迭代中,对项目内加油模块拆分的记录。如果有类似开发需求的同学,可做参考

场景

由于加油业务迅速扩张,加油模块成了我们项目内使用频率最高的模块。此时项目组考虑把加油模块单独拆分成一个独立APP,方面加油用户直接使用加油功能。

任务

拆分加油模块为一个独立APP,要求维护同一套代码,包实际体积减小

方案选择

预演的时候,一共提出四种方案如下:

  1. 直接新建个APP,把代码copy过去。
    优点:简单,基本就是搬砖的活。
    缺点:但是缺点也很明显,后续要维护两套代码,这是不能接受的;

  2. 在APP内新增预编译判断(preprocessor macros),AppDelegate入口处判断是是加油模块,进入加油页,不是则走原来逻辑。
    优点:这种方式最简单,也是维护同一套代码。
    缺点:包体积不变!我虽然只用加油的功能,但还是要下载整个APP,等于用原来的APP,但是只能使用加油功能。所以这种方案页被舍弃

  3. 组件化拆分加油模块,这种方式除了工作量大点没其他缺点

  4. 是组件化基础上改进的,不把模块传到cocoapods,通过本地管理。相对方案3省去了上传cocoapods的工作,也是最终选定的方案

实现

按照方案四

  1. 新建了target,在对应target内的Build Phases内导入需要的Compile Source,链接库,资源文件;

  2. 在新的Target对应的AppDelegate内配置入口,编译看效果。发现崩溃,是因为耦合了其他非加油模块的业务类;
    发现耦合主要来自:公共工具类,登录模块,支付模块,设备选择,设备新增及其他零星业务耦合;

  3. 公共工具类解耦,把这个类里设计到业务的方法拆分出去成为独立功能。如:自动登录,分享功能,播放器等,一共拆分出去11个具体业务子功能类。期间涉及到一下拆不出去的功能,就通过runtime的反射调用解耦;

  4. 再次对工具类整理,通过分类的方式,细分成NSString,UIImage,时间,UI,及其他操作几个分类;
    完成这一步,加油模块使用工具类就不会耦合其他业务线;

  5. 对登录,支付,设备选择和设备新增模块解耦;通过router中间件的方式解耦,传入类名和参数,中间件根据类名获取类NSClassFromString,创建UIVIewController对象,调用对象的初始化参数方法给对象设置参数,然后把对象返回给业务去做跳转

完成上面步骤,运行起来项目,达到了预期结果。同一套代码,一个新的APP,大小为原来的三分之一不到。

期间也踩了很多坑,pod库的问题,环境的问题,第三方库的问题,业务关联的问题

router核心代码

router

记住需要传参的类一定要实现初始化参数方法initViewControllerParam

初始化参数

总结

不要写很臃肿的工具类,会造成严重的耦合

以上就是对本次对模块拆分的简单介绍,有问题的欢迎留言指出。有更好解决方案的欢迎分享。
上一篇下一篇

猜你喜欢

热点阅读