去年,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
领取专属 10元无门槛券
私享最新 技术干货