ios - Realm 快速通知停止触发

标签 ios swift realm

我已经为实时结果对象设置了观察者。

let token = realm.objects(RealmObject.self).observe(on: realmQueue) { changeset in
   print(changeset)
}
它在大多数情况下都按预期工作,当我在 Realm db中添加/删除或编辑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 C#团队2015-2017年工作)。
我相当确定这是因为围绕主键的优化及其在事务中的使用,以及通知结构的构建方式。严格来说,这是一个错误。您可能希望这些内容在通知中以Delete + Add或Change记录的形式出现。
您正在与关于如何使用主键和优化以使它们以惊人的速度工作的深层核心假设抗衡。我强烈怀疑它是否会解决。
切换到非主键但使用索引字段可能会解决此问题,但会使其余代码复杂化,对不起。
根据您的数据量,也有可能根本不需要对它们进行索引。 Realm进行了一些令人难以置信的快速搜索,因此我总是建议人们首先尝试使用非索引搜索来看看是否足够。

关于ios - Realm 快速通知停止触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62695623/

相关文章:

ios - Objective-C 中的随机数

ios - 在 Swift 3 中按字母顺序排列两个字符串变量?

json - Realm 格式日期 JSON swift

android - Realm 异常 'value' 不是有效的托管对象

ios - 在我的 swift 项目中添加 Realm 数据库时出现 RLMCollection.h 错误

iphone - 如何在 iphone 中使用圆角标签,UILabel Round Corners

ios - admob ios7 错误音频框架

ios - 将 UITableViewCell 引用传递给其他 VC 使其消失

ios - 如何在 iOS 图表上正确显示底轴 (xVals) 上的标签?

swift - Xcode 调试器显示不正确的变量值