写点什么

Tripadvisor 将其 SwiftUI 应用迁移到可组合架构的历程

  • 2025-06-24
    北京
  • 本文字数:1320 字

    阅读完需:约 4 分钟

大小:656.69K时长:03:44
Tripadvisor将其SwiftUI应用迁移到可组合架构的历程

在一篇深度文章中,TripAdvisor iOS 首席工程师 Ben Sarrazin 讲述了他们向可组合架构(TCA)迁移的旅程。这一迁移的目的是取代他们现有 iOS 应用中的模型-视图-视图模型-协调器(MVVM-C)架构。

 

Sarrazin 解释说,离开 MVVM-C 的决定是由几个因素驱动的,这些因素都与应用复杂性的增长和团队的扩大有关。其中一个痛点是导航:

 

也许我们 MVVM-C 实现中最痛苦的一个方面是导航结构——或者更准确地说,是缺乏导航结构。我们的协调器可以启动其他任意一个协调器,结果发展成一个导航的可能性几乎无法被文档描述或推理的网络。

 

例如,当一个匿名用户访问网站并尝试执行需要认证的操作时,这种复杂性变得显而易见。即使在这样一个常见的场景中,MVVM-C 导航也会涉及众多协调器、视图模型和事件映射器,使得代码库难以理解和修改。

 

另一个挑战来自于协调器对 UIViewControllers 的依赖,这增加了复杂性,并要求使用 Combine 作为 SwiftUI 和 UIKit 之间的通信层。

 

调试基于 Combine 的事件链是非常困难的,特别是当它们跨越多个协调器并由多个发布者和操作符层组成时。

 

相比之下,TCA 承诺了几个优势,如与 SwiftUI 的无缝集成、强大的测试能力以及改进的可组合性。TripAdvisor 团队还看重 TCA 的发展和成熟度,及其高质量的文档和支持。

 

为了完成迁移,TripAdvisor iOS 团队采用了自下而上的方法。他们首先找出没有子级的视图模型,并将它们替换为 TCA 存储,然后逐步向上推广到父视图模型。

 

对导航元素也采用了类似的“叶到根”策略,但这里有一个转折。实际上,由于 TCA 需要集中的、基于状态的导航,协调器并没有一对一地替换。相反,父协调器承担了其子级的导航责任。最后这让导航有了单一真实来源:作为一个 TCA reducer 实现的全局路由器。

 

这种导航整合代表了我们迁移中最变革性的方面。我们目前有数十个具有重叠责任和复杂交互的协调器,最终我们将拥有一个干净、基于状态的导航系统,它更强大,也更容易理解。

 

这一迁移需要完全的心态转变,Sarrazin 解释说。它还带来了一些挑战。一个关键的洞察是,在 TCA 中复制现有的功能层次结构并不总是最佳方法。相反,团队学会了考虑在父组件和子组件之间发送动作的影响,这可能导致过度的双向通信。他们发现,更好的模式是在可能的情况下将共享行为集中到父组件中。

 

另一个挑战是在很短的时间内发出了太多动作,在滚动列表时就会出现这样的问题。为了解决这个问题,团队发现抑制高频输入,并尽量减少发送到存储的动作数量是很有效的,这样可以尽量在 reducer 中进行简单的状态更新。

 

TCA 在测试领域也带来许多好处,帮助减少测试的脆弱性。

 

我们发现,使用 TCA 的 TestStore 编写的测试为应用程序行为提供了更强的保证。通过测试让我们对功能按预期工作有很高的信心,这并不总是适用于我们之前的测试方法,特别是出现对 Combine 和调度器的重度依赖时。

 

此外,团队发现 TCA 测试通常可以成为一种设计反馈:当测试变得难以阅读或编写时,这通常是底层代码可以改进的迹象。

 

总的来说,根据 Sarrazin 的说法,迁移被证明是非常有效的。他的文章提供了许多宝贵的见解,超出了本文可以覆盖的范围。如果你对完整细节感兴趣,不要错过原文。

 

原文链接:How Tripadvisor Migrated to The Composable Architecture for Their SwiftUI App

2025-06-24 11:006832

评论

发布
暂无评论

OceanBase 4.0:当我们谈单机分布式一体化架构时,我们在说什么?

OceanBase 数据库

案例 | 拯救Larrakia

澳鹏Appen

人工智能 数据库 nlp 语音识别 数据标注

数衍科技与超市发达成合作,共同探索数字小票的新应用

科技怪咖

风险组件已经升级到最新版本,仍然提示风险,如何快速解决——kaptcha 安全漏洞

墨菲安全

Kaptcha 漏洞修复 开源安全 漏洞检测 开源安全与治理

推荐这几款好用的IDEA插件,一定不要错过

(-0 , +0)

IDEA 插件 8月月更

Python自学教程5-字符串有哪些常用操作

和牛

Python 测试 8月月更

一加和OPPO是什么关系?我来揭秘

Geek_8a195c

购物中心的运营保障,数衍科技数据桥接服务系统升级

科技怪咖

仅用3年!青软集团跃升华为云教育类目伙伴TOP2

科技怪咖

开源一夏 |分布式事务--TCC解决方案

六月的雨在InfoQ

开源 分布式事务 TCC 最终一致性 8月月更

IoT设备消息洪峰怎么扛? 阿里云AIoT消息队列深度解读——实践类

阿里云AIoT

nosql 算法 物联网 存储 消息中间件

零基础参加web前端培训薪资怎么样

小谷哥

社区疫情防控小程序源码

清风

源码 计算机毕业设计

web前端程序员学习靠谱吗?

小谷哥

活动预告(29日)|诚邀您参与AWS & 观测云「可观测性体验日」

观测云

ARMS实践|日志在可观测场景下的应用

阿里巴巴中间件

阿里云 云原生 可观测

java程序员培训学习靠谱吗

小谷哥

CSDN 报告:阿里云容器服务成为中国开发者首选

阿里巴巴中间件

阿里云 云原生 云原生容器

数字化时代CRM新的发展方向

力软低代码开发平台

大数据学习好还是自学的效果好?

小谷哥

defi质押dapp智能合约系统开发代码逻辑

开发微hkkf5566

A tour of gRPC:08 - gRPC 反射 与 Evans 客户端

BUG侦探

gRPC RPC protocolBuffer

Python自学教程4-数据类型学什么

和牛

Python 测试 8月月更

有个大神把牛客网的Java面试笔记在GitHub开源了

收到请回复

大数据 架构 语言 & 开发 开发技术

运营小能手看过来,龙蜥社区招募 5 名校园大使!(另兑换功能上线啦)

OpenAnolis小助手

龙蜥社区 礼品 开发者激励 校园大使 贡献兑换

EPPlus - 用于 .NET 的 Excel 电子表格

辣么大

Excel net 8月月更

北京前端培训学习怎么选择

小谷哥

在线医疗 | 眩晕智能语音问诊技术解决方案

擎声科技

RTC 实时音视频 语音通话 在线医疗 擎声Qtt

直播预告|FeatureStore Meetup V4携手第四范式 & 腾讯 & 微软大咖讲师,共探特征平台实践

星策开源社区

微软 腾讯 Feature Store 特征平台 MLOps

Tripadvisor将其SwiftUI应用迁移到可组合架构的历程_架构_Sergio De Simone_InfoQ精选文章