去年,Reddit 一直在努力改进其 iOS 应用的性能,同时使其适合更快的迭代周期,改善其测试覆盖率,提高其可扩展性。所有这些都是通过把应用原来的MVC 架构改造成 Model-View-Presenter(MVP)架构实现的。
原来的 MVC 设计其中一个主要的问题是容易导致大量的视图控制器,这是由于视图和它需要的控制器之间是紧耦合的。其中一个明显的影响是滚动性能退化,从60fps 降到了45-55fps,Reddit 工程师Andrew Rohn 这样写道。视图- 控制器的耦合导致任何改进视图实现的尝试都需要复制数千行的控制器代码。因此,Reddit 工程师开始重写其应用的某些部分,迁移到 Model-View-Presenter(MVP)设计。
虽然与 MVC 差别不大,但 MVP 实现了展示层和业务逻辑的更好隔离,如下图所示。
按照这个思路,Reddit 工程师把任何非视图逻辑从 UIViewController 中移除,并放到只负责视图 - 模型交互的 Presenter 类中。这样,UIViewController 就负责诸如处理用户输入、设置视图、绑定及管理视图生命周期这样的任务。Presenter 则关注与它本身有关的数据获取、转换以及展示。MVP 的关键是,Presenter 不会直接访问视图对象,而是通过一个接口访问。
迁移到 MVP 改进了代码的模块化和可重用性,使得业务逻辑可以独立于视图进行测试。与 MVC 相比,MVP 还有其他的好处,Rohn 重点指出,它更适合组合而不是继承,因为 Presenter 是一个从视图控制器分离出的组件,更容易重用或用不同的实现替换。最重要的是,MVP 促成了视图层实现的重写,借助 Texture 的多线程解决了滚动性能问题。Rohn 解释说,使用 Texture 的最大障碍是处理状态访问同步,这需要在 Presenter 忙于渲染输入 UI 时锁定状态。
MVP 只是众多 MVC 迁移选项中的一个。如果你对 iOS 应用架构的多种可选方法的比较分析感兴趣的话,可以读下 Chris Eidhof、Matt Gallagher、Florian Kugler 合著的 App Architecture, iOS Application Design Patterns in Swift。
查看英文原文: How Reddit Rewrote Their iOS App to Improve Performance, Modularity, and Testing
评论