在 MEGA,我们一直在寻找新的做事方式,以改进我们的工作方式。最近,我们的 MEGA iOS 团队采用了新兴的 SwiftUI 和 Combine 技术。现在我们已经完全接受了它们,绝对不会回头。
那么,为什么 MEGA iOS 团队要转向 SwiftUI 呢?在过渡到 SwiftUI 和 Combine 技术的背后,我们有什么想法?
1. 我们有很棒的第一手体验
2021 年 12 月,我们推出了一项新的照片库功能,以帮助超过 2.4 亿用户在 iOS 14+ 设备上使用和组织他们的相机上传媒体。这个中等规模的项目是使用 SwiftUI 和 Combine 技术构建的。这个项目有一些有趣的挑战;例如,动态网格布局、大型数据集和性能。为了解决这些挑战,我们一直在深入研究 SwiftUI,突破它的界限,跳出框框思考,并探索诸如此类的新技术可以提供的不同可能性。
这种宝贵的第一手经验让我们对 SwiftUI 框架、最佳实践以及我们将如何推进它有了很多见解。
2. SwiftUI 是 iOS 的未来
Apple 在其2019 年全球开发者大会(WWDC 2019)上宣布了 SwiftUI 。此后,Apple iOS 团队一直专注于改进 SwiftUI 框架。现在是 2022 年,如果你问任何 iOS 工程师,他们会告诉你 SwiftUI 是未来。很明显,苹果绝大多数的 UI 工程资源都投入到了 SwiftUI 上。例如,在去年的 WWDC 2021 上,SwiftUI 的会话数量远远超过了 UIKit。活动每天都有 4 到 6 场有关 SwiftUI 更新的会议,总共 17场 SwiftUI 会议,而 UIKit 只有 4 场。
我们似乎很清楚 SwiftUI 是 iOS 的未来,对于那些追随行业趋势的人来说,这可能并不令人惊讶——整个移动世界正在被声明式范式所改造。React Native 和 Flutter 由来已久,原生的 Android Jetpack Compose 也在快速发展。
与命令式编程相比,声明式编程有许多优点:
- 工程师专注于构建什么而不是如何构建,从而加快开发速度
- 更简单、更容易理解的语法和良好的可维护性
- 更好地分离 UI 逻辑和数据管理
- 不可变的 UI 以确保完整性并避免意外的数据不一致
- 状态驱动——单一事实来源原则
- 直观——UI 只是底层状态的反映
- 清晰的数据流——用户操作改变状态,状态更新 UI。
对于 MEGA,这些因素在决定现在使用 SwiftUI 的过程中发挥了重要作用,我们已经享受到了好处。随着 Apple 将 SwiftUI 推到如此程度,我们认为每个 iOS 团队都需要考虑是否是时候让他们获得 SwiftUI 及其声明式风格的支持。在 MEGA,我们决定现在就使用 SwiftUI,因为好处很明显,而且以后过渡的成本可能很高。
3. 促进创新思维
创新思维和对它的热情为跳出框框思考、寻找巧妙的解决方案、寻找最佳创意和激励我们的工程师打开了新的大门。创新意味着拥抱新技术、及早了解并从中受益。
在 MEGA,我们正在快速发展,目标是成为我们业务领域和技术堆栈的领导者,因此我们一直在研究、试验和探索新的有趣技术。我们对 SwiftUI 的承诺是我们劳动的自然成果,因为它体现了我们对技术创新的态度。
4.它鼓励工程卓越和兴奋
让事情顺利进行总是很容易,但要实现 MEGA 所追求的卓越工程却非常困难。凭借我们从声明式范式中获得的巨大优势,SwiftUI 使我们朝着卓越的工程迈进了一步。
其中一个关键部分是这些技术为我们整个团队注入活力的方式。自从我们开始在 SwiftUI 中构建功能以来,我们的 iOS 工程师一直受到真正的启发和兴奋。不仅仅是 SwiftUI 本身——向新的技术堆栈的转变是一个很好的机会,可以拓宽视野、激发新思维并采用新的最佳实践和工程原则。由于工程 SwiftUI 功能,我们一直在将我们的代码质量提升到一个全新的水平。
5.它有助于吸引顶尖人才
伟大的工程师是充满激情和不断学习的。他们倾向于让自己了解最新技术,因此他们始终可以在自己的领域保持敏锐和相关性。像这样的工程师希望加入像 MEGA 这样处于 iOS 开发前沿的团队,学习新技术。为了吸引和激发这些伟大的工程师,并在内部培育新的工程师,显然我们不能停滞不前。创新和拥抱新技术与吸引顶尖人才齐头并进。
另一方面,在这个瞬息万变的世界中,如果一个团队不转向新一代技术,最终将很难找到热情的工程师在一个陈旧过时的平台上工作。
6. 风险可控
尽管有明显的潜力,但在承诺使用 SwiftUI 和 Combine 构建我们复杂的照片库功能之前,我们必须检查潜在的风险。好消息是,经过三年的演进,SwiftUI 正在变得稳定和成熟。从每年的 WWDC 中我们可以看到,Apple 一直在用 SwiftUI 重写越来越多的自己的应用程序。事实上,我们的一些 iOS 工程师已经从个人项目中获得了 SwiftUI 和 Combine 的经验。考虑到这一点,我们有足够的信心使用 SwiftUI 开发一个大型项目。
从技术角度来看,我们有:
- UIViewRepresentable
- UIViewController 可表示
- UIHostingController
轻松桥接 UIKit 和 SwiftUI。
从架构的角度来看,我们使用的是 Clean Architecture。我们已经将表示逻辑从 UI 逻辑中分离出来,因此在最坏的情况下,我们可以将 SwiftUI 与 UIKit 交换。作为表示逻辑分离的一部分,我们尽量避免使用:
- @State
- @Environment
- @EnvironmentObject
传递和管理视图内部的状态。相反,对于每个视图,我们创建了一个视图模型来负责状态和表示逻辑,使用:
- @StateObject
- @ObservedObject
视图只是状态的观察者,它非常愚蠢。UI 视图中的逻辑越少,我们的演示视图模型就越可测试和可重用。
挑战和下一步
说 SwiftUI 到目前为止一直非常顺利是错误的。正如预期的那样,拥有如此复杂的照片库功能,我们确实发现了许多挑战,例如:
- SwiftUI 和 Combine 都需要彻底改变编程思维方式,并且对于大多数工程师来说是一个相当陡峭的学习曲线
- SwiftUI 的内存管理并不简单。我们花了很多时间调试和分析,以了解状态如何更新其依赖的视图
- SwiftUI 仍处于快速发展阶段,我们发现大型数据集存在一些性能问题。例如,由于缺少重用机制, LazyVGrid的性能似乎不如 UICollectionView。
与任何新技术一样,陡峭的学习曲线和最初的生产力问题也是意料之中的。但是,我们相信,随着我们对 SwiftUI 经验的增长,我们的粗糙补丁将会被解决,生产力将会蓬勃发展。我们已经对 SwiftUI 的简单性和效率印象深刻,而且我们知道未来还会有更多。
由于我们在分析 SwiftUI 内存管理和性能以及使用该技术的过程中获得了很多见解,因此我们希望分享我们的发现。我们计划发布一系列关于 MEGA 使用 SwiftUI 的旅程的帖子,所以请关注这个空间。
同时,如果您觉得这听起来令人兴奋,请不要犹豫,申请我们的空缺职位。我们发展迅速,需要优秀的人才加入我们,共同打造行业领先的解决方案和产品。
精品教程推荐
加入我们一起学习SwiftUI
QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com