【问题标题】:Realm Notification Firing Multiple Times Consecutively连续多次触发领域通知
【发布时间】:2017-09-12 06:30:20
【问题描述】:

Swift 3.1、Xcode 8.3.3

我在我的应用程序的视图控制器中设置了一个领域通知,在我的应用程序启动后,它连续触发 4 次。

let realm = try! Realm()
notificationToken = realm.addNotificationBlock { notification, realm in
  print("notif: \(notification)") <-- Logs 4 times in a split second
  self.refreshData()
}

由于 refreshData() 方法是刷新我的 UI(其中包含绘制的图形)的原因,因此每次刷新时我都会看到抖动/闪烁。

有没有办法将这些通知聚合成一个通知,以便我只刷新一次 UI?

【问题讨论】:

  • 您应该首先弄清楚是什么触发了通知。还可以考虑只过滤相关的通知,这样它就不会为不相关的更改调用刷新。

标签: swift realm


【解决方案1】:

如果您在 Realm 实例上设置通知块,您将在每次写入事务时收到通知。要将单个通知“聚合”为一个,您需要将单独的写入事务合并为一个。

例如,这段代码会触发两个通知:

try! realm.write {
    realm.add(Person(value: ["name":"John"]))
    realm.add(Person(value: ["name":"Chris"]))
}

try! realm.write {
    realm.add(Person(value: ["name":"James"]))
}

虽然此代码只触发一个:

try! realm.write {
    realm.add(Person(value: ["name":"John"]))
    realm.add(Person(value: ["name":"Chris"]))
    realm.add(Person(value: ["name":"James"]))
}

根据@bdash 的评论进行澄清,即使docs state that “每次提交涉及该领域的写入事务时,无论写入事务发生在哪个线程或进程上,都会触发通知处理程序...",实际上来自多个写入事务的通知可能会根据通知代码处理写入事务所需的时间合并为一个。

【讨论】:

  • 这不太对。可能会为每个写入事务触发一个通知,但 Realm 也会将多个事务的更改合并到一个通知中。这完全取决于 Realm 的通知代码处理写入事务期间所做的更改的速度。
  • 感谢您的澄清,我的回答基于我可以从测试中获得的内容以及文档状态,即:“每次提交涉及该领域的写入事务时,无论哪个线程或处理发生了写事务,通知处理程序将被触发:"。我想文档需要根据您的评论进行一些澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
相关资源
最近更新 更多