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

mel*_*sam 1 realm swift realm-mobile-platform

在后台异步保存对象时,我得到RLMException:'无法添加来自不同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!
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

TiM*_*TiM 6

境界Object实例不能在线程之间移动,一旦他们被保存到境界.因为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!
        }
    }
}
Run Code Online (Sandbox Code Playgroud)