在领域集合更改通知中知道对象的哪个元素已更改?

时间:2018-10-02 14:29:26

标签: ios iphone swift realm swift4

我为对象集合添加了一个通知。我像下面的代码一样观察它。在更新部分的 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
        }
    }

1 个答案:

答案 0 :(得分:0)

是的,有可能获得插入,删除和更改。但是首先,您需要注意一些事项:

您正在观察的结果集应该是有序查询,有关更多详细信息,请参见docs。作为开发人员,标准取决于您。

也许是一个例子

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]
    }