我有一个应用程序,当NotificationCenter
中按下按钮时,会使用viewControllerA
来调用viewControllerB
中的某个功能。它按预期工作,有点像。这是一般设置:
的 ViewControllerA
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(self.reloadMainPageVC), name: NSNotification.Name(rawValue: NotificationName.reloadingMainPageVC), object: nil)
}
func reloadMainPageVC(){
//appends some arrays
self.tableView.reloadData()
print("we reloaded viewControllerA")
}
这些函数允许重新加载viewControllerA
的tableview。可以通过按下viewControllerB
中的按钮来调用它
的 ViewControllerB
func postNotificationtoReloadMainPageVC() {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: NotificationName.reloadingMainPageVC), object: nil)
}
@IBAction func buttonTap(_ sender: UIButton) {
postNotificationReloadMainPageVC()
}
这可以理解为按下viewControllerB
中的按钮确实会重新加载viewControllerA
中的表格。第一次点击此按钮重新加载viewControllerA
,日志显示为we reloaded viewControllerA
。我现在清除日志。再次点击此按钮(第二次)将导致viewControllerA
被重新加载两次(这会导致一些重复项由于某些异步附加而显示在表中)并且日志现在显示为{{ 1}}。我再次清除日志。第三次按下按钮会导致we reloaded viewControllerA we reloaded viewControllerA
重新加载三次,现在日志显示为viewControllerA
。
问题
如果不是很明显,问题在于,无论我按下按钮的次数多少,每次按下按钮都会导致只有一次重新加载we reloaded viewControllerA we reloaded viewControllerA we reloaded viewControllerA
的tableview 。但是,第二次按下按钮会两次,第三次按三次等等
我认为原因是什么
我并不完全理解viewControllerA
的基本机制,但我的猜测(这是一个直接猜测)是,每次通知都被“发布”按钮被点击,但在点击按钮之前已经存在的任何通知,另外运行到正在发布的新通知。即第一次按下按钮时,没有预先存在的通知,因此它会运行一次。 0 + 1 = 1.第二次,但是已经存在通知,因此按下按钮会调用1(前一个)+ 1(新)= 2 ...因此它会运行两次。
或许这是完全错误的,这是别的什么?
我认为解决方案可能是
如果我对问题根源的猜测是正确的,可以通过添加从NotificationCenter
删除以前存在的通知来解决此问题:
NotificationCenter
问题是我不知道它的语法是什么。同样,我的假设完全有可能也是错的......在这种情况下......问题是什么以及如何解决?