Realm + Swift:当使用Realm通知时,是否有任何方法可以识别被添加,删除或修改的对象的主键?



我已经在一个集合上注册了一个通知处理程序,如下所示

https://www.mongodb.com/docs/realm/sdk/swift/react-to-changes/

根据文档"这个RealmCollectionChange解析为一个索引路径数组,你可以传递给UITableView的批量更新方法">

在我的用例中,我没有使用UITableView和indexPaths没有相关性。是否有任何方法使用indexPaths来识别集合中的对象?

这个问题非常好,我们经常遇到;想知道什么对象被更改了,而不是对象的索引。虽然Realm观察者将显示被更改对象的索引,但它并不显示对象本身。

如果对象被修改了,您可以通过其索引从原始结果中查找它,但是如果它被删除,它将不再存在于结果中。结果是实时更新的,并且总是反映底层数据-如果它在磁盘上,它就会在结果中消失。

这里有一个选择。假设有一个tableView,其中有一个可以插入,修改或删除的人员列表。

这段代码所做的是保存一个非托管对象的masterList,它是实际对象的副本。我们将其设置为非托管,因为,根据上述,结果反映底层托管数据-非托管结果不受这些更改的影响。

var masterList = List<PersonClass>()
func observePeople() {
guard let realm = gGetRealm() else { return }
self.peopleResults = realm.objects(PersonClass.self)
self.personNotificationToken = self.peopleResults.observe { [weak self] (changes: RealmCollectionChange) in
guard let strongSelf = self else { return }
switch changes {
case .initial:
for person in strongSelf.peopleResults {
let unmanagedPerson = PersonClass(value: person)
strongSelf.masterList.append(unmanagedPerson)
}
case .update(_, let deletions, let insertions, let modifications):
for index in deletions.reversed() {
let deletedPerson = strongSelf.masterList[index]
// do something with deletedPerson
strongSelf.masterList.remove(at: index)
}

我只包含了删除的代码。

初始加载数据时,遍历结果并创建非托管对象副本并将其存储在List中。

当一个对象被删除时,我们知道它的索引,并且可以访问masterList中的非管理人员,对该对象做我们需要做的事情,然后他们删除对象,以便两个列表保持同步。我们进行了反向迭代,从List的底部向上删除,以保持索引对齐。

还有许多其他选项;删除时,将删除的对象(副本)存储在类var中,然后在删除事件触发时对其进行处理。甚至还有键路径观察

的选项

最新更新