SwiftData赋值关联时触发NSInvalidArgumentException异常排查
SwiftData关联对象时触发不同上下文异常的原因及解决方法
问题原因
- 未定义关系逆属性:
SchoolClass与SchoolClassSubject的一对多关系缺少逆属性声明,导致SwiftData无法正确识别和管理对象间的关联逻辑。 - 对象上下文不一致:创建
SchoolClassSubject实例后,未将其插入到与schoolClass相同的modelContext中。schoolClass已被插入当前上下文,但新创建的SchoolClassSubject默认属于临时上下文,关联不同上下文的对象就会触发异常。
解决步骤
1. 补充关系的逆属性定义
修改SchoolClass的模型代码,添加@Relationship注解指定逆属性:
@Model class SchoolClass { var name: String @Relationship(deleteRule: .cascade, inverse: \SchoolClassSubject.schoolClass) var schoolClassSubjects: [SchoolClassSubject] = [] init(name: String) { self.name = name } }
2. 确保关联对象处于同一上下文
有两种实现方式:
- 方式一:手动插入对象到上下文
创建SchoolClassSubject后,立即将其插入当前modelContext:
Button("add", action: { let schoolClass = SchoolClass(name: "test") modelContext.insert(schoolClass) let schoolClassSubject = SchoolClassSubject(schoolClass: schoolClass) modelContext.insert(schoolClassSubject) schoolClass.schoolClassSubjects.append(schoolClassSubject) })
- 方式二:利用关系自动关联上下文
由于已定义逆属性,将SchoolClassSubject添加到已插入上下文的schoolClass关系数组时,SwiftData会自动将SchoolClassSubject插入同一上下文,无需手动调用insert:
Button("add", action: { let schoolClass = SchoolClass(name: "test") modelContext.insert(schoolClass) schoolClass.schoolClassSubjects.append(SchoolClassSubject(schoolClass: schoolClass)) })
验证效果
完成以上修改后,点击按钮创建对象时,两个模型对象会处于同一上下文,关联关系可正常建立,不会再触发异常。
内容的提问来源于stack exchange,提问作者David Schilling
相关产品推荐
相关产品推荐

