Ios 如何正确删除域中的对象并保证线程安全

Ios 如何正确删除域中的对象并保证线程安全,ios,multithreading,object,exception,realm,Ios,Multithreading,Object,Exception,Realm,我刚刚开始使用Realm,感觉它非常好,速度很快,除了一件事:删除Realm中的对象很容易导致异常 有什么方法可以删除域安全中的对象吗 在我的项目中,我通常需要在后台线程上创建、更新、删除100个对象。问题是: 如果应用程序当前在主线程上显示/使用一个对象 在后台,我删除了那个对象。 =>在使用该对象的属性时,主线程上的将导致异常 我知道Realm有isInvalid方法要检查,但我无法在每个assign properties代码中添加检查,这看起来不太好 所以,到目前为止,我要做的是:我没

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

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

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

  • 如果应用程序当前在主线程上显示/使用一个对象
  • 在后台,我删除了那个对象。 =>在使用该对象的属性时,主线程上的将导致异常
我知道Realm有isInvalid方法要检查,但我无法在每个assign properties代码中添加检查,这看起来不太好

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


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

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

为了处理这个问题,Realm提供了一种方法,您可以使用它在Realm数据库的内容发生更改时自动接收警报,并相应地更新UI

如果有一个视图控制器显示单个领域
对象的内容
,则可以实现一个系统,在领域数据库发生任何更改时收到通知,然后检查以确保对象仍然有效:

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中的特定领域
对象是否未被删除。如果有,那么您可以简单地关闭UI

根据您的具体需要,还可以使用更细粒度的通知系统专门跟踪作为查询结果一部分的领域
对象的更改。在文档的领域中有这方面的示例代码


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

谢谢Tim,我会试试你的解决方案谢谢你!如果这解决了你的所有问题,请将答案标记为已接受