WWDC 20 `@StateObject` 和 `@ObservedObject` 区别

2020/9/27 posted in  SwiftUI

在WWDC 20 新增了 @StateObject , @StateObject 基本上来说就是一个针对 class 的 @State 升级版

他们的区别简单而言就是:

使用 @ObservedObject 修饰的属性会随着View更新重新创建,而 @StateObject 修饰的属性不会随着 View 更新被重新创建。

@StateObject 详解

@ObservedObject 只是在 View 和 Model 之间添加订阅关系,而不影响存储,@StateObject 则是针对 ObservableObject class 的存储。它保证这个 class 实例不会随着 View 被重新创建。

除了确保单次创建外,@StateObject 的另一个重要特性是和 @State 的“生命周期”保持统一,让 SwiftUI 全面接管背后的存储,也可以避免一些不必要的 bug。

总结

简单说,对于 View 自己创建的 ObservableObject 状态对象来说,极大概率你可能需要使用新的 @StateObject 来让它的存储和生命周期更合理:

struct MyView: View {
    @StateObject var model = Model()
}

而对于那些从外界接受 ObservableObject 的 View,究竟是使用 @ObservedObject 还是 @StateObject,则需要根据情况和需要确定。像是那些存在于 NavigationLink 的 destination 中的 View,由于 SwiftUI 对它们的构建时机并没有做 lazy 处理,在处理它们时,需要格外小心。

Reference

注:本文摘录自喵神的文章:
@StateObject 和 @ObservedObject 的区别和使用