我添加了一个对象集合的通知。我观察它就像下面的代码。在update部分的switch case块中,我只能获得修改对象的索引。但是,我想知道modifiedObject的哪个变量已经改变了。有办法进入吗?
notificationTokens.conversationMessages = Result?.observe {[weak self] changes in
self?.result = Array(Result!)
if self?.isLoaded == false { return }
switch changes {
case let .update(_, deletions, _, modifications):
if deletions.count > 0 {
self?.updateUI(scrollToEnd: true)
}
default:
break
}
}
最佳答案
是的,可以得到插入、删除和更改。但首先,你应该注意以下几点:
您正在观察的结果集应该是有序查询,有关详细信息,请参见this question。标准取决于你作为开发人员。
举个例子
let mySortedObjects = realm.objects(MyObject.self).sorted(byKeyPath: "createdAt", ascending: true)
case let .update(_, deletions, _, modifications):
语句初始化deletions
、insertions
和modifications
变量,每个变量都是整数数组,因此此语法是modifications: [Int]
的缩写。modifications
数组中包含的整数是集合中已更改元素的索引。回到
case let .update(_, deletions, _, modifications)
语句,您用_
忽略的第一个变量是结果集(与原始查询相同,称为mySortedObjects: Results<MyObject>
),因此您的代码可以更改为case let .update(results, deletions, _, modifications):
考虑到这一点,可以更容易地获得变化的元素:
case let .update(results, deletions, _, modifications):
for index in modifications {
// modifiedObject is an instance of `MyObject`
let modifiedObject = results[index]
}