Swift - 领域,成功添加项目后完成
Swift - Realm , completion after successfully adding item
所以我有这段代码,用于将项目添加到领域中:
static func insertAsynctTest(_ objects: [Object], success: @escaping () -> Void, failure: @escaping () -> Void) {
DispatchQueue.global().async {
autoreleasepool {
if let realm = getInstance() {
do {
try realm.write {
for object in objects {
realm.add(object, update: .modified)
}
success()
}
} catch let error as NSError {
print("Something went wrong: \(error.localizedDescription)")
failure()
}
}
failure()
}
}
}
关闭是必须的,因为我需要知道操作已经完成。
现在发生的事情是我不知道领域是否完成了在他的线程中添加,所以 success() 是错误的,因为循环完成但添加没有,当我在粉碎后尝试获取数据时出现以下错误:"Realm accessed from incorrect thread"。
有没有办法知道添加完成?
谢谢
Realm 不是线程安全的。 "Realm accessed from incorrect thread" 意味着您首先在不同的线程上初始化了领域,现在您正试图在不同的线程上访问领域。您应该始终在首先初始化的线程上访问领域。
如果先在主线程中初始化领域,则只能在主线程中访问领域。
还有另一种跨线程访问领域的方法。它是通过使用 ThreadSafeReference
//If you have a person initialized from a different thread, create a ThreadSafeReference for that object
let personRef = ThreadSafeReference(to: person)
现在您可以在任何线程中使用该对象
DispatchQueue(label: "com.example.myApp.bg").async {
let realm = try! Realm()
guard let person = realm.resolve(personRef) else {
return // person was deleted
}
try! realm.write {
person.name = "Jane Doe"
}
}
请参考领域documentation线程安全。
所以我有这段代码,用于将项目添加到领域中:
static func insertAsynctTest(_ objects: [Object], success: @escaping () -> Void, failure: @escaping () -> Void) {
DispatchQueue.global().async {
autoreleasepool {
if let realm = getInstance() {
do {
try realm.write {
for object in objects {
realm.add(object, update: .modified)
}
success()
}
} catch let error as NSError {
print("Something went wrong: \(error.localizedDescription)")
failure()
}
}
failure()
}
}
}
关闭是必须的,因为我需要知道操作已经完成。 现在发生的事情是我不知道领域是否完成了在他的线程中添加,所以 success() 是错误的,因为循环完成但添加没有,当我在粉碎后尝试获取数据时出现以下错误:"Realm accessed from incorrect thread"。 有没有办法知道添加完成? 谢谢
Realm 不是线程安全的。 "Realm accessed from incorrect thread" 意味着您首先在不同的线程上初始化了领域,现在您正试图在不同的线程上访问领域。您应该始终在首先初始化的线程上访问领域。
如果先在主线程中初始化领域,则只能在主线程中访问领域。
还有另一种跨线程访问领域的方法。它是通过使用 ThreadSafeReference
//If you have a person initialized from a different thread, create a ThreadSafeReference for that object
let personRef = ThreadSafeReference(to: person)
现在您可以在任何线程中使用该对象
DispatchQueue(label: "com.example.myApp.bg").async {
let realm = try! Realm()
guard let person = realm.resolve(personRef) else {
return // person was deleted
}
try! realm.write {
person.name = "Jane Doe"
}
}
请参考领域documentation线程安全。