gpt4 book ai didi

ios - 如何正确且线程安全地删除 Realm 中的对象

转载 作者:可可西里 更新时间:2023-11-01 05:50:07 24 4
gpt4 key购买 nike

我刚刚开始使用 Realm,感觉它非常好,速度很快,除了一件事:在 Realm 中删除一个对象很容易导致异常。

有什么方法可以删除 Realm 安全的对象吗?

在我的项目中,我通常需要在后台线程上创建、更新、删除数百个对象。问题是:

  • 如果应用当前在主线程上显示/使用一个对象
  • 在后台,我删除了那个对象。=> 在主线程上使用该对象的属性时会引发异常。

我知道 Realm 有 isInvalid 方法来检查,但我不能在每个分配属性代码中添加检查,它看起来不太好。

所以,到目前为止,我所做的是:我没有实际删除,而是有一个名为“已删除”的属性,在删除时,我只更新该值。在 UI 上,我将过滤掉 deleted = true 的对象

我想知道有没有更好的方法来做到这一点?

最佳答案

这是预期的功能。如果后台线程删除了 Realm Object,下次您尝试从任何线程访问该对象时,将抛出异常。

为了处理这个问题,Realm 提供了 a rich notification system当 Realm 数据库的内容发生更改时,您可以使用它来自动接收警报,并相应地更新 UI。

如果你有一个显示单个 Realm Object 内容的 View Controller ,你可以实现一个系统来通知你的 Realm 数据库所做的任何更改,然后检查确保您的对象仍然有效:

class MyViewController : UIViewController {
var myModel: Object = nil
var notificationToken: NotificationToken? = nil

init(model: Object) {
self.myModel = model
}

override fun viewDidLoad() {
super.viewDidLoad()

notificationToken = myModel.realm.addNotificationBlock { notification, realm in
guard myModel.invalidated == false else {
// The object has been deleted, so dismiss this view controller
}
}
}

deinit() {
notificationToken?.stop()
}
}

每次写入事务修改特定 Realm 文件中的某些内容时(即使在后台线程上),都会触发该通知 block ,这使您有机会检查您的特定 Realm Object 在该用户界面尚未删除。如果有,那么您可以简单地关闭 UI。

根据您的具体需求,还有一个更细粒度的通知系统,您可以使用它来专门跟踪对作为查询结果一部分的 Realm Objects 的更改。 Collection Notifications 中有相应的示例代码 Realm 文档。

如果您需要进一步说明,请告诉我! :)

关于ios - 如何正确且线程安全地删除 Realm 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240367/

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