Search code examples
iosswiftrealm

RLMException attempting to create object with an existing primary key after check


I'm receiving an RLMException for the following reason:

Attempting to create an object of type 'Student' with an existing primary key value '258975085-504336622-62850'.

The confusing part is that it's occurring just after a check that there are no existing objects with this key in the 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
    }
}

This code is all running asynchronously on the GCD utility queue, inside a do/catch block. It's triggered by a button in the user interface, but nothing else is accessing realm at the same time.

Why could that if statement allow the else code to run?


Solution

  • Answering my own question because I found the problem.

    I think the problem was a previous app screen trying to save (the same) student object on a queue with Utility quality of service, meaning that it finished saving after the call to realm.object(...), but before the call to realm.add(...).

    Moving the if statement inside the realm write transaction also helped (thanks EpicPandaForce).