Swift 在后台线程中保存对象时的RLMEException

Swift 在后台线程中保存对象时的RLMEException,swift,realm,realm-mobile-platform,Swift,Realm,Realm Mobile Platform,在后台异步保存对象时,我会得到RLMException:“无法添加来自不同领域的对象”。但是,如果删除异步代码,同样的保存也可以正常工作 此对象与现有对象具有关系。例如: class Person: Object { name: String school: School } class School: Object { name: String } let person = new Person() person.name = "John" person.school = sc

在后台异步保存对象时,我会得到RLMException:“无法添加来自不同领域的对象”。但是,如果删除异步代码,同样的保存也可以正常工作

此对象与现有对象具有关系。例如:

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
集合中选择的。

Realm
object
实例保存到Realm后不能在线程之间移动。由于
school
将是一个在主线程上实例化的对象,因此您将其附加到一个未持久化的对象并将批次移动到后台线程,从而创建冲突

要解决此问题,您需要使用创建
school
对象的背景版本

另外,除非您有在主线程上创建
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!
        }
    }
}

领域<代码>对象实例一旦保存到领域,就不能在线程之间移动。由于
school
将是一个在主线程上实例化的对象,因此您将其附加到一个未持久化的对象并将批次移动到后台线程,从而创建冲突

要解决此问题,您需要使用创建
school
对象的背景版本

另外,除非您有在主线程上创建
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!
        }
    }
}

谢谢你给我指明了正确的方向。正如你所指出的,我犯的一个错误是在主线上创造人。干杯别担心!很高兴我能帮忙!:)我觉得Realm需要更好的文档。我非常确定我列出的所有信息现在都在Realm文档中。:)谢谢你给我指明了正确的方向。正如你所指出的,我犯的一个错误是在主线上创造人。干杯别担心!很高兴我能帮忙!:)我觉得Realm需要更好的文档。我非常确定我列出的所有信息现在都在Realm文档中。:)