SwiftUI中EnvironmentObject视图更新后根应用未同步问题求助
以下是几种可能导致该异常的原因,结合你的场景逐一分析:
打印时机不匹配
你在newPot视图中是修改数据后立即打印,此时内存中的userData已经更新;但根应用中的打印触发时机可能早于数据修改完成。比如根视图的打印代码写在onAppear里,而子视图修改数据后根视图不会重新触发onAppear,所以打印的还是初始化时的旧数据。或者根应用的打印是在App结构体的初始化阶段,之后数据修改不会再触发这个打印。手动发送
objectWillChange的时机错误
如果你的UserData没有用@Published修饰数组属性,而是手动调用objectWillChange.send(),注意必须在修改数据之前发送通知,SwiftUI才能正确捕获数据变化并更新视图状态。如果是修改后再发送,根视图的观察者可能无法及时感知到数据更新,导致打印时拿到的还是旧值。JSON序列化操作干扰了内存数据
若你在插入Pot后立即执行JSON序列化存储,而序列化过程中存在错误(比如序列化失败后回滚了数组,或者使用了错误的方式读取/写入数据),可能导致内存中的userData数组被意外重置。虽然子视图修改后马上打印能看到新数据,但序列化操作异步执行后覆盖了内存中的数据,等根视图打印时数据已经被改回旧状态。数组修改的方式不符合引用类型特性
如果你的UserData类中的Pot数组是用不可变方式修改的(比如错误地创建了新数组但没有赋值回原属性),比如写了let newArray = userData.pots + [newPot]但没把newArray赋值给userData.pots,这种情况下子视图可能误判数据已更新,但实际原对象的数组并没有变化——不过你说已确认是同一对象,这种概率较低,但可以再检查数组修改的代码。
内容的提问来源于stack exchange,提问作者Albinch

