我添加了一个对象集合的通知。我观察它就像下面的代码。在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):语句初始化deletionsinsertionsmodifications变量,每个变量都是整数数组,因此此语法是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]
    }

07-26 06:58