RLMException 尝试在检查后使用现有主键创建对象

And*_*ndy 6 realm ios swift

我收到一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在 GCD 实用程序队列上异步运行,位于 do/catch 块内。它由用户界面中的按钮触发,但同时没有其他任何东西访问领域。

为什么那个 if 语句允许 else 代码运行?

And*_*ndy 0

回答我自己的问题,因为我发现了问题。

我认为问题是之前的应用程序屏幕试图将(相同的)学生对象保存在具有实用服务质量的队列中,这意味着它在调用 后realm.object(...)但在调用 之前完成保存realm.add(...)

将 if 语句移至领域写入事务内也有帮助(感谢 EpicPandaForce)。