如何正确删除Realm中的对象和线程安全

时间:2016-08-31 03:41:41

标签: ios multithreading object exception realm

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

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

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

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

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

所以,截至目前,我所做的是:我没有实际删除,我有一个属性调用"已删除",而在删除中,我只更新该值。在UI上,我将过滤掉已删除= true

的对象

我想知道有没有更好的办法呢?

1 个答案:

答案 0 :(得分:2)

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

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

如果您有一个显示单个域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()
   }
}

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

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

如果您需要进一步说明,请与我们联系! :)