很早之前使用CTMediator做了组件化,在使用过程中有些不太方便的地方:
- Swift项目,底层使用OC的反射,本身就没有完全发挥出Swift的优势。
- runtime说不定什么就被苹果抛弃,不是长久之道,特别是这种项目中核心功能。
- 业务逻辑操作的时候Provider还不够灵活。
基于以上3个原因,一直在考虑如何更加优雅的组件化。很早之前知道OC的依赖注入Objection,但是一直没有深入了解,后来又接触到Typhoon和Swinject。 觉得是否可以再仔细研究下。
Objection & Typhoon
这2个都是OC的库,具体用法可以参考https://www.jianshu.com/p/6177ec61f79f。
- Objection使用起来比较灵活,用法比较简单。
- Typhoon的使用起来就比较规范,首先需要创建一个 TyphoonAssembly的子类。其需要注入的方法和属性都需要写在这个统一个子类中,当然可以实现不同的子类来完成不同的功能。
抛弃Typhoon:
Typhoon是只要继承TyphoonAssembly,那么这个类中所有方法,被通过runtime保存起来。 所以考虑即使Typhoon支持Swift,而且实际使用中的确不如Objection方便,所以被我很快抛弃了。
使用Objection
Objection整体代码虽然涉及到了runtime和KVC,但是我们可以避免使用。查看Objection源码发现在注入或者获取的时候,可能会涉及到。getObject的时候从context取,如果没有从globalContext获取,同时存入context。如果没有绑定过,就new一个对象,最终通过KVC设置对应属性。
所以我们只要保证getObject之前是bind过对象的 同时不需要使用自动注入(比如objection_requires_sel)
, 这样核心功能就不会触发runtime了,效率得到保证。
基于上面思想,我做了Objection组件Demo。
VC跳转流程:
- AModuleConfigure里面绑定了AViewController的Class Type和AModuleProvider
- AModuleProvider里面创建AViewController对象,设置对应参数。 返回实例对象
- 跳转的时候,通过Path 获取到AViewController的Class Type。 用Class Type在Objection里面找到对应AModuleProvider,从而得到具体vc实例对象进行跳转。
(AModuleConfigure 和 AModuleProvider其实都可以放到CommonModule里面统一处理,这样会尽量避免objection污染)
(第三步中通过Path 获取到AViewController的Class Type
其实是反射,如果也是通过Objection来存储,应该效率更高些。 )
获取Provider方法流程:
- CommonModule里面针对每个子Module创建一个Provider
- 子Module继承CommonModule里面的Provider,demo里面分别是AProviderLmpl和BProviderLmpl
- 在调用Provider里面单例方法的时候,由于AModuleConfigure里面绑定了Provider,所以获取到是AProviderLmpl。这样就可以使用AProviderLmpl里面的方法了。
Swinject
上面实现了OC项目组件化,那么Swift呢? 幸运的是也有对应的库Swinject
因为Swinject再页面跳转传递参数的时候,不是很好控制。所以加上了URLNavigator来做路由管理。 当然OC项目也可以,这里列举2个:
HHRouter和JLRoutes。
VC跳转流程:
- 在ViewController里面(可以放到AppDelegate里面)注册Assembly,其中CommonAssembly会注册和初始化navigator
- ARouter里面注册了页面调整回调
- 通过调用CommonRouter里面的跳转方法来触发具Module里面之前的注册回调。
获取Provider方法流程:
- CommonModule里面针对每个子Module创建一个Provider
- 子Module继承CommonModule里面的Provider,demo里面分别是AProviderImpl和BProviderImpl
- 在调用Provider里面单例方法的时候,由于AAssembly里面绑定了Provider,所以获取到是AProviderImpl。这样就可以使用AProviderImpl里面的方法了。
可以在Common里面抽取、封装Swinject和URLNavigator,这样可以减少污染。
网友评论