SwiftUI内功之View Tree 视图更新机制

请注意,本文不适合初学者观看。文章内容是在帮助用户从初级菜鸟升级为中高级开发者,零基础的朋友建议去看我的基础教程

本文收获

  • 了解SwiftUI如何更新界面的
  • 知晓SwiftUI机制的优势

传统更新界面的悲催方式

在大多数面向对象的 GUI 应用程序中(如 UIKit 应用和浏览器中的文档对象模型 (DOM) 应用)中,有两个与视图相关的代码路径:一个路径处理视图的初始构造,另一个路径在事件发生时更新视图。由于这些代码路径的分离和涉及的手动更新,很容易出错:我们可能会更新视图以响应事件,但忘记更新模型,反之亦然。在这两种情况下,视图都会与模型不同步,应用程序可能会表现出未定义的行为,陷入死胡同,甚至崩溃。通过纪律和测试可以避免这些错误,但并不容易。

苹果曾经的解决方案

在 AppKit 和 UIKit 编程中,有许多技术试图解决此问题。AppKit 使用 Cocoa 绑定技术,这是一个双向层,用于保持模型和视图的同步。在 UIKit 中,人们使用React等技术(大部分)统一两个代码路径。

SwiftUI 旨在完全避免此类问题。首先,有一个代码路径来构造初始视图,并且还用于所有后续更新视图的body属性。其次,SwiftUI 使得无法绕过正常的视图更新周期并直接修改视图树。触发对body属性的重新评估是更新 SwiftUI 中屏幕内容的唯一方法

当框架需要呈现更新的视图树时,最简单的实现可能只是扔掉所有内容,然后从头开始重绘屏幕。但是,这是低效的,因为基础视图对象(例如,UITableView)重新创建的成本可能很高。更糟糕的是,重新创建这些视图对象可能意味着丢失视图状态,如滚动位置、当前选择等。

要解决此问题,SwiftUI 需要知道需要更改、添加或删除哪些基础视图对象。换句话说:SwiftUI 需要将以前的视图树值(评估body的结果)与当前视图树值(状态更改后重新评估正文的结果)进行比较。SwiftUI 有一堆技巧,可以优化此过程,以便即使在大型视图树中也能有效地执行更改.

在理想情况下,我们不必了解有关此过程的任何内容,就可以直接使用 SwiftUI。但是,这些实现细节总是以这样或那样的形式影响我们编程。我们需要对SwiftUI 的视图更新机制具有一定了解,这样至少我们不会妨碍 SwiftUI高效地执行自己的工作。

你可能感兴趣的:(SwiftUI内功之View Tree 视图更新机制)