【问题标题】:RealmCollectionChange modified parameter has multiple indexes when only one object is modified仅修改一个对象时,RealmCollectionChange 修改参数有多个索引
【发布时间】:2017-12-30 15:11:24
【问题描述】:

问题:在Realm中修改单个对象时,RealmCollectionChange中的修改参数被传递多个索引

详细信息:给定一个包含 Dog 对象列表的 Person 对象和一个拥有 Person 类型的 owner 属性的 Dog 对象

class Dog: Object {
    @objc dynamic var name = ""
    @objc dynamic var owner: Person?
}

class Person: Object {
    @objc dynamic var name = ""
    let dogs = List<Dog>()
}

然后用两条狗创造一个人

let person0 = Person()
person0.personName = "Leroy"

let dog0 = Dog()
dog0.name = "Spot"
dog0.owner = person0

let dog1 = Dog()
dog1.name = "Rex"
dog1.owner = person0

person0.dogs.append(dog0)
person0.dogs.append(dog1)

//write person0 to Realm which creates the person and two dogs

还有观察功能

func doObserve() {
    let realm = try! Realm()
    let results = realm.objects(Dog.self)

    notificationToken = results.observe { [weak self] (changes: RealmCollectionChange) in

        switch changes {
        case .initial:
        case .update(_, let deletions, let insertions, let modifications):
            for index in deletions {
                print("deleted object at index: \(index)")
            }

            for index in insertions {
                print("inserted object at index: \(index)")
            }

            for index in modifications {
                print("modified object at index: \(index)")
                let object = results[index]
                print(object) //prints dog0 and dog1 when dog1 is mod
            }
        case .error(let error):
            fatalError("\(error)")
        }
    }
}

那么,如果使用 RealmBrowser(或使用 App 中的代码)打开 Realm 文件并将 Dog1 (Rex) 名称更改为 Fluffy,则 RealmCollectionChange 中的修改参数包含两个索引,0 和 1,即使只有 dog1 (索引 1) 已修改。

这种行为是否正确,如果正确,是否有另一种选择来获取被修改的(索引)对象?

(或者我完全错过了一些明显的东西?)

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    当您修改 dog1 时,dog0.owner.dogs[1] 已更改,因此 Realm 报告 dog0 也已修改。

    目前无法手动指定您希望 Realm 检查对象更改的路径深度,但您可以通过将 Person 的 List&lt;Dog&gt; 更改为 LinkingObjects&lt;Dog&gt; 来回避此行为,因为在检查更改时不遵循反向关系。这也将消除在两个地方设置关系的需要。

    【讨论】:

    • 我不得不花一些时间来消化并尝试这个答案,并且您使用 LinkingObjects 而不是手动创建反向关系的建议似乎有效,并且只报告被修改的狗的索引。谢谢!
    • 这导致的问题是,有时我们需要了解狗的主人,有时我们需要了解主人的狗。如果我们按照您的建议设置我们的对象,我们将无法再查询所有者以查看他们是否有特定的狗。我们需要从 Dog 对象中进行查询吗?即,如果我们想打印一个所有者和他们的狗的列表,我们将能够读取所有所有者对象并遍历它们并打印每个对象。
    • 您可以使用与列表相同的方式查询 LinkingObjects(即,即使 Dogs 是 LinkingObjects&lt;Dog&gt;,您也可以使用 realm.objects(Person.self).filter("ANY dogs = %@", dog))。
    • 感谢您的解释,是的,效果很好。供将来的读者参考,如果 Person 对象具有 dogs = LinkingObjects 属性,并且您想找到名称为“Rex”的狗的主人,这将起作用; results = realm.objects(Person.self).filter("ANY dogs.name == %@", "Rex")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2013-09-19
    • 2011-03-28
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多