你的观点的寿命不属于你

主要观点:

  • 2019 年宣布 SwiftUI 时,苹果工程师强调 SwiftUI 的 View 与 UIKit/AppKit 视图不同,Viewbody 属性会被任意频繁评估,导致 View 也会被任意频繁初始化,所以 SwiftUI 视图应为可栈分配的结构体且构造应廉价。
  • 符合 View 的结构体的生命周期与代表用户界面部分的概念性事物的生命周期无关。
  • SwiftUI 属性包装器在包装值初始化器中使用 @autoclosure 参数是不良的 API 设计选择,会隐藏属性包装器自身频繁初始化的事实,影响开发者理解。
  • 应避免在 View 的初始化器(不仅是 body 属性)中进行昂贵的工作,忽略 View 结构体的生命周期,使用生命周期修饰符(如 .onAppear.task)来构造昂贵对象。

关键信息:

  • SwiftUI View 的特性及与其他框架视图的区别。
  • @StateObject 及其自动闭包初始化器存在的问题。
  • 避免在 View 初始化器中进行昂贵工作的建议及原因。
  • 忽略 View 生命周期的重要性及原因。
  • 使用生命周期修饰符的好处。

重要细节:

  • struct MyParentView: View { var body: some View { MyChildView() } } 中,评估 MyParentViewbody 必然会运行 MyChildView 的初始化器。
  • 对于 @StateObject var model = MyViewModel()@State var model = MyViewModel()StateObject 的名称易混淆行为。
  • 资源获取即初始化的概念,@State 属性的包装值每次包含视图初始化时都会被评估。

总结:SwiftUI 中 View 的特性及相关设计问题与建议,强调避免在 View 初始化器中进行昂贵工作,忽略生命周期,使用生命周期修饰符等,以提高性能和代码理解性。

阅读 8
0 条评论