从全局数组向SwiftData添加数据未达预期问题排查
问题原因分析
核心本质
你遇到的不是SwiftData的bug,而是它的托管对象生命周期特性导致的:
- 全局数组
GLOBAL_ZOO里的LION和GOAT是单例实例,第一次点击按钮时,这些对象会被插入到ModelContext中,成为托管对象。 - SwiftData不允许将同一个托管对象实例重复插入上下文,后续调用函数时,虽然函数确实执行了,但尝试插入已经被托管的对象会被框架直接忽略,所以看不到新数据添加。
为什么移到函数内就正常?
把数组放到函数内部后,每次点击按钮都会创建全新的对象实例,这些实例处于未被托管的状态,每次都能被正常插入到上下文,所以每次点击都会新增数据。
简单验证方法
可以在插入前打印对象的isPersisted属性:
print(lion.isPersisted)
第一次调用时会输出false,如果是全局对象,后续调用会输出true——这就说明对象已经被托管,无法重复插入。
内容的提问来源于stack exchange,提问作者fuzzygoat
相关产品推荐
相关产品推荐

