@ObservedObject重初始化对SwiftUI视图渲染的影响探究
问题
从Stack Overflow关于《@ObservedObject model lifecycle?》的用户回答中了解到:每次创建视图时都会实例化新的TestModel实例,SwiftUI视图更像是在应用生命周期中频繁创建和销毁的视图描述。但同时得知,SwiftUI会先检查新计算的视图与之前的状态是否不同,再进行渲染。那么,若@ObservedObject被重新创建,会对视图更新产生怎样的影响?是SwiftUI先对比新旧视图再决定是否更新,还是@ObservedObject的重创建一定会触发新的视图更新?
回答
- 当
@ObservedObject被重新创建时,它会变成一个全新的对象——哪怕初始状态和旧实例完全一致,内存地址也不一样。SwiftUI判断引用类型依赖是否变化时,看的是**对象身份(内存地址)**而非值内容,所以这个新实例会被视为视图的全新依赖,直接触发视图的重新计算(生成新的View结构体)。 - 但触发视图重新计算≠一定会触发界面渲染。SwiftUI生成新的View结构体后,会对比新旧视图的body输出内容:如果新视图的布局、显示文本等和旧视图完全一致,它会跳过实际的屏幕渲染步骤,只更新内部的依赖关联;只有当body内容确实有变化时,才会更新界面。
- 不存在“谁先谁后”的顺序问题:
@ObservedObject重创建会先让SwiftUI判定视图依赖变化,触发重新计算;之后才会进行视图内容对比,决定是否渲染。换句话说,重创建一定会触发视图的重新计算流程,但最终是否渲染到屏幕上,要看body的实际输出有没有变化。
内容的提问来源于stack exchange,提问作者infoMining
相关产品推荐
相关产品推荐

