领域快速通知停止触发
Posted
技术标签:
【中文标题】领域快速通知停止触发【英文标题】:Realm swift notification stops firing 【发布时间】: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
部分?
【参考方案1】:
这敲响了警钟(我曾在 Realm C# 团队 2015-2017 工作)。
我相当肯定这是因为围绕主键的优化及其在事务中内的使用,以及通知结构的构建方式。严格来说,这是一个错误。您可能期望这些会以 Delete+Add 或通知中的更改记录的形式出现。
您正在与关于如何使用主键以及旨在使它们以难以置信的速度运行的优化的深层核心假设作斗争。我强烈怀疑它会得到修复。
切换到非主键但索引字段可能会解决这个问题,但会使您的其余代码复杂化,抱歉。
根据您的数据量,您也可能根本不需要对这些进行索引。 Realm 的搜索速度非常快,所以我总是建议人们先尝试非索引搜索,看看是否足够。
【讨论】:
以上是关于领域快速通知停止触发的主要内容,如果未能解决你的问题,请参考以下文章
使用来自领域数据库swift的日期设置UserNotification
本地通知 UNTimeIntervalNotificationTrigger triggerWithTimeInterval 每 1 分钟触发一次 如何停止