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

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

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

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

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

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

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

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

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

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

如果您有一个显示单个Realm对象内容的视图控制器,您可以实现一个系统,以通知您对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中的特定域对象是否尚未删除.如果有,那么您可以简单地关闭UI.

根据您的特定需求,还可以使用更细粒度的通知系统来专门跟踪作为查询结果一部分的Realm对象的更改.在Realm文档的Collection Notifications中有示例代码.

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

点赞