抖音 iOS 推荐 Feed 容器化总结( 二 )


基础组件
Feed容器的基础组件部分 , 采用的方式是平台方统一进行维护 。 目前的基础组件 , 主要包括播放控制、播放策略优化、列表预加载以及页面管理等 。
其中 , 全屏Feed相关的基础组件 , 为多业务共用 , 具备可复用、可扩展等优势 。
业务组件
业务组件是和业务强相关的组件 , 业务方可以根据自身的需要进行灵活定制 , 组件本身可插拔 , 由各业务方进行维护 。
应用场景
业务方基于Feed容器 , 组合业务组件和基础组件构建的页面 , 在构造过程中可以基于配置文件实现容器的定制 , 比如推荐和关注 。
容器化工具多个业务耦合在同一个容器中 , 导致容器类越来越臃肿 , 一方面造成各方同时维护越来越困难 , 另一方面对于新业务和新同学接入十分不友好 , 需要花费很多时间熟悉上下文以避免改动对其他业务造成影响 。
为此设计了ControllerKit库 , 该库实现了复杂页面的分发 , 解决ViewController臃肿问题 , 规范代码拆分标准 , 提供分发方法的能力 。 各个接入方按照规则注册后 , 实现自己关心的生命周期方法 , 并在方法中实现对应的逻辑即可 。
抖音 iOS 推荐 Feed 容器化总结
文章图片
ContainerViewController
ContainerViewController是容器ViewController , 实现了ContainerProtocol , 保存了上下文环境 , 负责了各个生命周期方法的分发 。
ContainerProtocol
声明了容器对外提供的属性和方法 , 方便各个SubController进行访问 。
ControllerProtocol
声明了基础的声明周期和共有的方法 。
Controller
Controller是将ViewController中的代码拆分出来的子模块 , 可以接收分发出来的viewDidLoad、viewWillAppear等生命周期及自定义方法调用 , 还可以向ViewController中添加子View 。
ControllerManager
ControllerManager负责Controller的注册、管理、方法分发 。 通过classNameArray返回Controller的字符串类名数组即可 , 可以支持Controller在其他仓库的能力
Manager需要声明分发的Controller协议 , 只需要声明 , 不需要实现 , Manager内部会通过消息转发机制统一分发 。
各角色之间的关系
ContainerViewController实现了ContainerProtocol , 并持有ControllerManager , 各个子Controller注册到ControllerManager中 , 各个Controller可以通过ContainerProtocol访问容器的能力 , ControllerManager通过ControllerProtocol里面声明的方法进行分发 。
比如:ContainerViewController初始化后调用viewDidLoad时 , 会通过ControllerManager依次分发到实现该方法的controller中 , 各个Controller在自己的viewDidLoad方法中实现自己的逻辑即可 。
Controller优先级
方法分发优先级按照数组提供的顺序 , 因此更基础的Controller应排在前面优先级由注册顺序决定 , 因此不同方法优先级无法调整 , 也不希望有调整 , 无法满足时 , 通过其他方式实现Feed容器的实现根据ControllerKit对Feed容器的类结构改造如下所示
抖音 iOS 推荐 Feed 容器化总结
文章图片
FeedViewController作为容器 , 实现容器能力 , 对外通过FeedContainerProtocol被访问Controller对应业务组件FeedControllerManager负责组件的注册、管理和事件的分发基于ControllerKit的设计和实现
各个类和协议的介绍:
FeedContainerProtocol
容器层通过FeedContainerProtocol对外提供能力避免业务方直接访问和修改容器类该协议提供了业务层需要的各种能力和接口由平台方进行维护FeedControllerProtocol
业务层协议通过FeedControllerProtocol声明定义了各个生命周期相关的方法 , 被各个业务controller实现各个实现业务只需要在对应的生命周期方法中增加自身的逻辑即可被注入的controller会在相应的时机被调用到业务自闭环Context与ContainerProtocol的定位和区别