我刚刚开始使用Realm并感觉它非常好,速度很快,除了一件事:删除Realm中的对象很容易导致异常。
有什么方法可以删除Realm安全中的对象吗?
在我的项目中,我通常必须在后台线程上创建,更新,删除100个对象。问题是:
我知道Realm有isInvalid方法需要检查,但是我不能在每个assign属性代码中添加检查,它看起来不太好。
所以,截至目前,我所做的是:我没有实际删除,我有一个属性调用"已删除",而在删除中,我只更新该值。在UI上,我将过滤掉已删除= true
的对象我想知道有没有更好的办法呢?
答案 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中有示例代码。
如果您需要进一步说明,请与我们联系! :)