在后台线程中保存对象时出现 RLMException
RLMException when save an object in a background thread
在后台异步保存对象时,我得到 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>
集合中选择的。
Realm Object
实例一旦保存到 Realm 就不能在线程之间移动。由于 school
将是在主线程上实例化的对象,因此您通过将其附加到 un-persisted 对象并将批次移动到后台线程来创建冲突。
要解决此问题,您需要使用 Realm's thread reference feature.
创建 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!
}
}
}
在后台异步保存对象时,我得到 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>
集合中选择的。
Realm Object
实例一旦保存到 Realm 就不能在线程之间移动。由于 school
将是在主线程上实例化的对象,因此您通过将其附加到 un-persisted 对象并将批次移动到后台线程来创建冲突。
要解决此问题,您需要使用 Realm's thread reference feature.
创建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!
}
}
}