【发布时间】:2020-07-02 11:44:01
【问题描述】:
我已经为实时结果对象设置了一个观察者。
let token = realm.objects(RealmObject.self).observe(on: realmQueue) { changeset in
print(changeset)
}
它在大多数情况下按预期工作,当我在领域数据库中添加/删除或编辑 RealmObject 类型对象时会触发它。 当我尝试用新数组替换整个对象数组时,就会出现我的问题。基本上我所做的就是让所有 RealmObjects 类型的对象删除它们,然后添加新的 RealmObjects 数组。现在的问题是,如果我在一个写入事务中执行删除和添加,通知机制似乎会中断,它不会触发此操作。另一方面,如果我将删除和添加到不同的写入事务中,那么一切都适用于通知(除了在这种情况下我收到两个通知,但这不是我想要的)。 我是否错过了什么并做错了什么?
// triggers notifications
let objectsToDelete = realm.objects(RealmObject.self)
try realm.write {
if !objectsToDelete.isEmpty {
realm.delete(objectsToDelete)
}
}
try realm.write {
realm.add(objects)
}
// doesn't trigger notification
let objectsToDelete = realm.objects(RealmObject.self)
try realm.write {
if !objectsToDelete.isEmpty {
realm.delete(objectsToDelete)
}
realm.add(objects)
}
编辑:经过进一步调查,这似乎只发生在特定情况下。当用相同数量的项目和相同的主键替换项目时(即使其他一些属性不同)。
class RealmObject: Object {
@objc dynamic var primary: String!
@objc dynamic var summary: String!
override class func primaryKey() -> String? {
return "primary"
}
}
extension RealmObject {
convenience init(summary: Int, uuid: String = UUID().uuidString) {
self.init()
self.primary = uuid
self.summary = "Object nr. \(summary)"
}
}
let sharedKeys = [UUID().uuidString, UUID().uuidString, UUID().uuidString]
let initialObjects = [RealmObject(summary: 0, uuid: sharedKeys[0]),RealmObject(summary: 1, uuid: sharedKeys[1]),RealmObject(summary: 2, uuid: sharedKeys[2])]
let replaceObjects = [RealmObject(summary: 3, uuid: sharedKeys[0]),RealmObject(summary: 4, uuid: sharedKeys[1]),RealmObject(summary: 5, uuid: sharedKeys[2])]
【问题讨论】:
-
我复制并粘贴了您的代码并运行了第一段代码和第二段代码,并且运行正常且完全相同。两者都导致写入新对象,并且观察函数继续在新对象上触发事件。为了验证,我运行了这两个部分的代码并使用 Realm Studio 修改了结果对象,同时应用程序正在正确运行这两种情况下触发的事件。
-
@Jay 真的不知道发生了什么,我在操场上尝试的这段代码以及通知中的第二部分都没有触发,之后它就无法工作了不管我做什么。你用的是什么领域,xcode 版本?
-
用一些新信息编辑了我的问题
-
XCode 11.3.1、Realm API 5.1 和今天的 5.2。为什么/如何用相同的主键替换对象?主键应该始终是唯一的。我也很好奇这个
convenience init(summary: Int, uuid: String = UUID().uuidString) {- 你为什么在初始化中做这个uuid: String = UUID().uuidString部分?