说到解耦,可能大部分人会潜意识的认为业务组件间的解耦是最根本的,也是最重要的。这个说法个人认为没什么问题,今天所说的就是业务组件间解耦的一部分----AppDelegate入口解耦。
首先想一下我们在做组件化的过程:主工程一般成员是没法看到的,更别说去操作了,只有老大才能根据团队成员的需要去做一些配置、管理什么的。团队成员做业务组件的时候是在一个新的工程进行的,在example里面进行测试,最终cocoapods化,或者二进制化。
这个时候就会出现一个问题,如果你的业务组件需要在主工程的AppDelegate里面处理一些事情,比如说环境配置、推送、初始化第三方等,那应该怎么处理?一般情况我们在开发的时候会在业务工程里面的AppDelegate里直接进行操作,最后集成到主工程的时候告知老大在主工程的AppDelegate里面进行相应配置。
这样做的问题在哪呢?
- 业务组件的解耦不彻底,需要依赖主工程的AppDelegate。
- 工程师不能方便的管理自己的业务工程的AppDelegate。
- 增加了工程师的时间开销,效率降低。
- AppDelegate不便维护。
如何去解决这个问题呢?
- 核心问题1:让每个组件都可以拥有类似UIApplicationDelegate代理方法这样的在AppDelegate执行的方法 。
- 核心问题2:在主工程的AppDelegate对应的UIApplicationDelegate代理方法里面实现所有业务组件需要在该代理方法实现的内容。
实现思路:
核心问题1 的解决:使用协议,协议里面声明的就是类似UIApplicationDelegate代理方法。业务组件里面添加一个遵循这个协议的对象,实现你想在AppDelegate里面实现的对应方法。
核心问题2 的解决:使用单例类,添加全局变量NSMutableArray用于存放各业务组件里面的问题1中的对象,在主工程AppDelegate的代理方法里面遍历数组调用各业务组件里面问题1对象的协议方法,当然,这个遍历数组、调用方法的实现应该放在单例类里面实现。
实现思路是这样的,具体实现给大家提供一个示例:
image.pngDMUserCenterModule:用户中心模块上面提到的对象。
DMApplicationDelegate:上面提到的协议。
DMAppDelegateManager:单例类。
DMUserCenterModule维护在各个业务组件里面;
DMApplicationDelegate、DMAppDelegateManager 一般维护在与业务不太相关的弱组件库里面。
具体实现就不做过多说明。
网友评论