SwiftUI @ObservedObject与@StateObject子视图性能对比及初始化问题
方案选择与实现说明
两种方案的优劣对比
- 子视图
init中创建@ObservedObject持有模型的方案问题:SwiftUI的视图为值类型,父视图每次刷新都会触发子视图的init方法,这会导致模型被反复重建,模型内存储的状态、正在执行的网络请求都会被中断,不仅性能更低,还会出现逻辑异常。 - 子视图用
@StateObject持有模型的方案优势:@StateObject由SwiftUI管理生命周期,只会在视图第一次创建时初始化一次,后续父视图刷新不会重建模型实例,完全匹配单元格独立持有模型、处理独立逻辑的需求,是更优的选择。
带参数的@StateObject初始化方法
你之前直接在属性声明处初始化@StateObject报错,是因为声明阶段还拿不到传入的item参数,需要放到子视图的init方法中,通过访问属性包装器的底层存储变量(下划线开头的变量名)完成带参初始化,正确写法如下:
struct TestCell: View { @StateObject private var model: ItemModel let item: ListItem init(item: ListItem) { self.item = item // 下划线访问StateObject的底层存储,传入你创建的带参数模型实例 _model = StateObject(wrappedValue: ItemModel(itemId: item.id)) } var body: some View { Text("item: \(item.name)") } }
父视图传@ObservedObject的适用场景
仅当模型的生命周期需要由父视图控制时才选择该方案,比如需要批量管理所有单元格的模型状态、跨单元格操作模型的场景,其余场景都优先选择@StateObject方案,无需父视图额外维护模型生命周期,内存管理更安全。
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

