【问题标题】:How to delete object in Realm properly and thread-safe如何正确和线程安全地删除领域中的对象
【发布时间】:2016-08-31 03:41:41
【问题描述】:

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

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

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

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

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

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

我想知道有什么更好的方法吗?

【问题讨论】:

    标签: ios multithreading object exception realm


    【解决方案1】:

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

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

    如果您有一个显示单个 Realm Object 内容的视图控制器,您可以实现一个系统来通知您对 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()
       }
    }
    

    每次写入事务修改特定领域文件中的某些内容时都会触发通知块(即使在后台线程上),这使您有机会检查该 UI 中的特定领域Object 是否没有被删除。如果有,那么您可以简单地关闭 UI。

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

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

    【讨论】:

    • 谢谢蒂姆,我会试试你的解决方案(y)
    • 谢谢全!如果这解决了您所问的所有问题,请将答案标记为已接受。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多