由于以下原因,我收到了RLMException
:
尝试使用现有主键值“258975085-504336622-62850”创建“Student”类型的对象。
令人困惑的部分是它在检查Realm中没有此键的现有对象之后才发生。
let realm = try Realm()
if let info = realm.object(ofType: Student.self, forPrimaryKey: newStudent.userId) {
try realm.write {
info.name = newStudent.name
info.school = newStudent.school
info.email = newStudent.email
}
}
else {
try realm.write {
realm.add(newStudent) //RLMException occurs here
}
}
此代码全部在执行/捕获块内的GCD实用程序队列上异步运行。它由用户界面中的按钮触发,但没有其他任何东西同时访问领域。
为什么if语句允许else代码运行?
try! self.realm.write {
self.realm.add(newStudent, update: true)
}
您正在使用现有主键添加相同的对象(学生)。所以你可以更新当前的一个。而不是删除和添加新的。
回答我自己的问题,因为我发现了问题。
我认为问题是之前的应用程序屏幕试图在具有实用程序服务质量的队列中保存(相同)学生对象,这意味着它在调用realm.object(...)
之后但在调用realm.add(...)
之前完成了保存。
在领域写事务中移动if语句也有帮助(感谢EpicPandaForce)。