Reddit重写其iOS应用,改进性能、模块化和测试

news/2024/7/6 1:43:51 标签: 测试, swift, ui

去年,Reddit一直在努力改进其iOS应用的性能,同时使其适合更快的迭代周期,改善其测试覆盖率,提高其可扩展性。所有这些都是通过把应用原来的MVC架构改造成Model-View-Presenter(MVP)架构实现的。

\\

原来的MVC设计其中一个主要的问题是容易导致大量的视图控制器,这是由于视图和它需要的控制器之间是紧耦合的。其中一个明显的影响是滚动性能退化,从60fps降到了45-55fps,Reddit工程师Andrew Rohn这样写道。视图-控制器的耦合导致任何改进视图实现的尝试都需要复制数千行的控制器代码。因此,Reddit工程师开始重写其应用的某些部分,迁移到Model-View-Presenter(MVP)设计。

\\

虽然与MVC差别不大,但MVP实现了展示层和业务逻辑的更好隔离,如下图所示。

\\

23255e26c5ef76434675199bfcd88810.jpg

\\

按照这个思路,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


http://www.niftyadmin.cn/n/1382687.html

相关文章

关于java中string的内存位置

java运行时内存分五部分: 线程共享:堆内存、方法区(包括常量池) 线程私有:栈内存、本地方法栈、程序计数器 string不是基本数据类型,那么一个string的内存位置是什么呢?一共有两种情况&#xff…

eslint的几种检测级别-syntax、problem、code style

JS作为一门动态类型的语言,在给开发者带来便利的同时,也不可避免的引起一些潜在问题。简单来说,它需要你在编程的时候充分的了解当前对象是否有你要使用的方法或者属性。 然后人脑毕竟是有限的。所以就需要一些手段帮你找到潜在的问题。这种…

配置fileupload(文件上传组件)

<properties><commons-fileupload.version>1.3.1</commons-fileupload.version> </properties><dependencyManagement><dependencies><!-- 文件上传组件 --><dependency><groupId>commons-fileupload</groupId>&l…

Docker逻辑数据流

最近在研究Docker,一种新的轻型虚拟化技术&#xff0c;个人觉得这是以后虚拟化的方向。从目前企业级及开源社区关于虚拟化的应用及关注方向&#xff0c;大多数使用重虚拟化技术&#xff0c;即在Hypervisor上为每个应用虚拟guest OS,对于guest OS&#xff0c;除了应用程序需要使…

PHP 的 preg_match 和 preg_match_all

preg_match为仅输出一个匹配结果 preg_match_all为输出全部匹配结果 <?php $tt<img src"/GTicket/Public/kindeditor/php/../attached/image/20160510081224_31958.png" alt"" /> <img src"http://s1.dwstatic.com/group1/M00/8F/DF/923…

MS MDS系列之MDS层次结构(Hierarchy)

在Master Data Services中&#xff0c;Hierarchy的作用主要用于&#xff1a; 对同属性成员进行分组聚合成员用于分析和报告输出写在开始&#xff1a;显示层次结构&#xff08;Explicit Hierarchy&#xff09;即将在新版本中不再应用了。应该是2016。如果还在用之前的版本&#…

TypeScript-Lookup Types - Cannot access ‘xxx‘ because ‘xxx‘ is a type, but not a namespac

如果我想希望使用某种类型声明的子类型作为某个变量声明的类型… export interface Car {Name: string;Speed: number;Manufactured: number; }const Speed: Car.Speed 200;上面的写法会抛出错误 Cannot access ‘Car.Speed’ because ‘Car’ is a type, but not a namespac…

玩转Go语言之结构体

结构体//定义结构体类型 type Person struct {name stringage intheight float64 }//定义结构体变量 var student Person//给结构体属性赋值 student.name "zhangsan" student.age 20 student.height 170.0//打印结构体 Println(student)复制代码总结:1.Go语言中的…