gpt4 book ai didi

ios - Realm - 数据库在删除后不是最新的

转载 作者:行者123 更新时间:2023-11-28 12:38:36 27 4
gpt4 key购买 nike

我的 Realm 数据库中有一些对象。我需要从中删除一个对象。当我从我的 Realm() 实例中删除我的对象时,对象被很好地删除

但是在执行删除请求后,我需要从数据库中检索所有的对象,但是这里令人惊讶的是,对象还在这里

我想我有一个线程问题,或者类似的问题。我不知道去哪里调查。

我的简化代码:

我的删除方法:

func myDeleteFunc(completion : ()->Void){
let realm = try! Realm()
// ...
try! realm.write {
realm.delete(myObject)
}
completion()
}
// Here the object have been deleted from the realm instance, no problem

此方法是从我执行完成 block 的 viewController 调用的。此完成 block 包含从我的 Realm 数据库中检索所有对象的请求:

执行方法的viewController和完成 block :

 myDeleteFunc(completion: {
DispatchQueue.main.async {
let realm = try! Realm()
let objects = Array(realm.objects(MyObject.self).sorted(byProperty: "aProperty"))
// Here objects still contains the object that I have already deleted
// ...
}
}

我认为我的 2 个 realm 实例不同,或者线程之间存在问题,因为我有一个 DispatchQueue.main.async

有什么想法吗?

编辑:

我注意到,当我检查断点时,有时它会起作用。

所以也许删除请求还没有提交,我在删除请求结束之前检索了对象?

最佳答案

确保将 async block 放入自动释放池中:

 myDeleteFunc(completion: {
DispatchQueue.main.async {
let realm = try! Realm()
let objects = Array(realm.objects(MyObject.self).sorted(byProperty: "aProperty"))
// Here objects still contains the object that I have already deleted
// ...
}
}

应该是

 myDeleteFunc(completion: {
DispatchQueue.main.async {
autoreleasepool {
let realm = try! Realm()
let objects = Array(realm.objects(MyObject.self).sorted(byProperty: "aProperty"))
// Here objects still contains the object that I have already deleted
// ...
}
}
}

确保您对创建 Realm 实例的任何后台线程执行此 autoreleasepool { ... } 包装,主要是在 GCD 中。


如果那仍然不起作用,您可以:

 myDeleteFunc(completion: {
DispatchQueue.main.async {
autoreleasepool {
let realm = try! Realm()
realm.refresh()

关于ios - Realm - 数据库在删除后不是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130946/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com