Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 域通知连续触发多次_Swift_Realm - Fatal编程技术网

Swift 域通知连续触发多次

Swift 域通知连续触发多次,swift,realm,Swift,Realm,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.refreshD

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()
}
let realm=试试看!领域()
notificationToken=realm.addNotificationBlock{通知,域在

打印(“notif:\(notification)”)如果在域实例上设置通知块,则每次写入事务都会收到通知。若要将单个通知“聚合”为单个通知,需要将单独的写入事务合并为单个通知

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

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的评论进行澄清,即使“每次提交涉及该领域的写入事务时,无论写入事务发生在哪个线程或进程上,都会触发通知处理程序…”,实际上,来自多个写入事务的通知可能会根据通知代码处理写入事务所需的时间合并为一个通知。

如果在域实例上设置通知块,则每个写入事务都会收到通知。若要“聚合”如果将单个通知合并为单个通知,则需要将单独的写入事务合并为单个通知

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

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的评论进行澄清,即使“每次提交涉及该领域的写入事务时,无论写入事务发生在哪个线程或进程上,都会触发通知处理程序…”在实际情况下,基于通知代码处理写事务所需的时间,可以将多个写入事务的通知合并为一个。

您应该首先弄清触发通知的内容。也考虑仅过滤相关通知,以便不调用无关的刷新。NT的变化。你应该先弄清是什么触发了通知。还考虑只过滤相关的通知,这样它就不会为无关的更改调用刷新。这不是完全正确的。可以为每个写事务触发通知,但Valice也会将多个事务的更改合并为单个NOTI。这完全取决于Realm的通知代码处理写入事务期间所做更改的速度。感谢您的澄清,我的答案基于测试结果和文档状态,如下所示:“每次提交涉及该领域的写入事务时,无论写入事务发生在哪个线程或进程上,都会触发通知处理程序:"。我想这些文档需要根据您的评论进行一些澄清。这并不完全正确。每个写入事务可能会触发一个通知,但Realm也会将多个事务的更改合并为一个通知。这完全取决于Realm的notif处理写入事务期间所做更改的速度代码。感谢您的澄清,我的回答基于我从测试中得到的信息以及文档的状态,即:“每次提交涉及该领域的写入事务时,无论写入事务发生在哪个线程或进程上,都将触发通知处理程序:”.根据你的评论,我想这些文件需要澄清一下。