【问题标题】:know which element of an Object changed in Realm Collection Change notification?知道在 Realm Collection Change 通知中更改了 Object 的哪个元素?
【发布时间】:2018-10-02 14:29:25
【问题描述】:

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

【问题讨论】:

    标签: ios iphone swift realm swift4


    【解决方案1】:

    是的,可以获取插入、删除和更改。但首先,您应该注意以下几点:

    您正在观察的结果集应该是有序查询,请参阅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]
        }
    

    【讨论】:

    • 我想我误用了元素这个词。我的意思是元素变量。例如,如果我的 modifiedObject 有 2 个变量:variable1:Int 和 variable2:String。我想知道是否对变量 1 或变量 2 进行了更改。有没有办法做到这一点?
    • 如果你设置了observeResults<MyObject>,就不可能知道哪个变量发生了变化。 Realm 文档指出“[集合通知] 包含自上次通知以来已添加、删除或修改的对象的索引。”如果您想知道单个对象的哪个属性被更改,您可以参考对象通知realm.io/docs/swift/latest/#object-notifications
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多