问题:在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)被修改。
这种行为是否正确?如果是这样,是否有另一种方法可以获得被修改的(索引)对象?
(或者我完全错过了一些明显的东西?)
答案 0 :(得分:0)
当您修改dog1时,dog0.owner.dogs [1]已更改,因此Realm报告也修改了dog0。
目前无法手动指定您希望Realm检查对象更改的路径深度,但您可以通过将Person
的{{1}}更改为可以回避此行为List<Dog>
,因为在检查更改时不会遵循反向关系。这也将消除在两个地方设置关系的需要。