Swift 在后台线程中保存对象时的RLMEException
在后台异步保存对象时,我会得到RLMException:“无法添加来自不同领域的对象”。但是,如果删除异步代码,同样的保存也可以正常工作 此对象与现有对象具有关系。例如: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
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
集合中选择的。Realmobject
实例保存到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文档中。:)