我刚刚开始使用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中有示例代码.
如果您需要进一步说明,请告诉我们! 🙂