iOS 组件化适用于偏大型的 App ,尤其是一个 App 由多人共同开发维护时。适用组件化,能够解耦不同模块,去除相互间的依赖,然后组员就能尽量将精力集中在个人的模块,提高开发效率。试想一下,当你坐下来开始今天的开发任务时,拉取别人的代码就花费了半天时间,内心一阵骂娘后,编程的心情恐怕就飞了。
CTMediator 是由天猫架构师 CasaTaloyum 提出的解决方案。个人实验后,感觉实现思路十分清晰,操作性非常强。下面就他的实现思想进行一下解读,方便后来者在操作中能够抓住思考主线,减少不必要的折腾。
组件化的出发点就是解耦模块,比如在使用 App 模块 A 时,要求必须先登录,这个时候就会调用登录模块 L 。这种场景下,A 模块就依赖了 L 模块。两个模块之间有时还需要传递参数 params 。那么如何解耦呢?通过中间件 CTMediator 来实现。CTMediator 并不是简简单单的将 A / L 联系起来,而是规定了 A 模块和 L 模块间实现通信的规则。如果将 A 和 L 比作两个需要做买卖的 Boss,通常的理解是两者找个跑腿的小弟 C 去传话。这样做由于 C 低下的地位会导致 A 和 L 按照自己的喜好发布命令,C 就很难让二者做一锤子买卖。怎么办呢?提高 C 的地位,让 C 成为大 Boss ,自己独自确定 A 和 L 买卖的方式。
CTMediator 就是这种实现方式。里面定义好了要进行通信模块的命名规则和实现规则。然后 A 和 L 模块都必须按照这种方式来实现,如果没有实现,CTMediator 中定义了默认处理方式。而且 CTMediator 更进一步,派出了小弟去需要通信的模块去办事。这样 A 模块和 L 模块只要依赖 CTMediator 派往自己的小弟,不同的小弟依赖 CTMediator 就可以了。可以用下图表示:
通过 Cocoapod 实现就是 「ModuleA」、「ACategory」、「ModuleB」、「BCategory」都是一个独立的工程,相互之间通过私有库的方式建立联系。CTMediator 已经贴心地将一些 podspec 文件的制作携程了 shell 脚本,在 Mac 平台下能够快速完成。
思想是实践的指引,有了整体的认识,下面操作起来就会得心应手,快快试试吧:在现有工程中实施基于CTMediator的组件化方案