当仅修改一个对象时,RealmCollectionChange修改的参数具有多个索引

时间:2017-12-30 15:11:24

标签: swift realm

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

详细信息:给定一个Person对象,该对象具有Dog对象列表和具有Person类型所有者属性的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打开Realm文件(或使用App中的代码)并将Dog1(Rex)名称更改为Fluffy,则RealmCollectionChange中的修改参数包含两个索引0和1,即使只有dog1(索引1)被修改。

这种行为是否正确?如果是这样,是否有另一种方法可以获得被修改的(索引)对象?

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

1 个答案:

答案 0 :(得分:0)

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

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