1

在后台异步保存对象时,我得到RLMException: 'Can not add objects from a different Realm'。但是,如果删除异步代码,相同的保存工作正常。

该对象与现有对象有关系。例如:

class Person: Object {
  name: String
  school: School
}

class School: Object {
  name: String
}

let person = new Person()
person.name = "John"
person.school = school // Existing object selected from a dropdown.

DispatchQueue.global().async {
    do {
        let realm = try Realm!

        try realm.write {
            realm.add(person, update: true)
        }

        DispatchQueue.main.async {
            // Success!
        }
    } catch let error as NSError {
        DispatchQueue.main.async {
            // Error!
        }
    }
}

此代码会导致崩溃。但是,如果我删除 DispatchQueye.global().async,一切正常。我遇到了一些线程问题吗?

注意:该school对象是预先存在的,并且是从Results<School>集合中选择的。

4

1 回答 1

6

Object一旦将Realm实例保存到 Realm,就不能在线程之间移动它们。由于school将是在主线程上实例化的对象,因此您通过将其附加到非持久对象并将该批次移动到后台线程来创建冲突。

要解决此问题,您需要school使用Realm 的线程引用功能制作对象的背景版本。

此外,除非您有在主线程上创建的特定原因,否则Person我还建议将其创建也移至后台线程。

let schoolRef = ThreadSafeReference(to: school)

DispatchQueue.global().async {
    do {
        let realm = try Realm!

        let person = new Person()
        person.name = "John"
        person.school = realm.resolve(schoolRef)!

        try realm.write {
            realm.add(person, update: true)
        }

        DispatchQueue.main.async {
            // Success!
        }
    } catch let error as NSError {
        DispatchQueue.main.async {
            // Error!
        }
    }
}
于 2017-01-30T05:48:14.563 回答