【问题标题】:Remove previously posted notification删除之前发布的通知
【发布时间】:2017-02-20 05:24:11
【问题描述】:

在某个按钮单击事件上从NSNotificationCenter 发布通知因此,当我有快速按钮事件时,通知被多次调用会导致许多问题。当快速事件发生时,我想取消之前发布的通知。如何处理下面的代码。

func buttonClick() {    
// I want to cancel the previous Event here
NSNotificationCenter.defaultCenter().postNotificationName("Event", object: self)
}

更新:

让我清楚地解释一下我想要什么,实际上我有一个观察者方法,当按钮点击发生时,我想发布一些通知来控制一些 UI 元素,比如更改按钮图像。问题是当我快速点击按钮时,观察者被多次调用,并且我的通知被发布在相同的计数上,因此 UI 闪烁我无法控制按钮点击事件上的观察者我只能控制发布的事件从我身边。

非常感谢任何帮助。

【问题讨论】:

  • 你在哪里添加你的通知观察者?
  • @Matt 一些其他类基于我正在执行一些操作,比如更改按钮图像。
  • 如果已发布通知,则不应发布通知
  • 我不想在快速按钮事件发生时发布通知,假设更改 UI 会延迟。
  • 您无法真正取消之前发布的NSNotification。布尔检查更好地避免您的问题

标签: ios swift notifications nsnotificationcenter


【解决方案1】:

NSNotificationCenter.post() 是同步的。在所有观察者都执行完他们的操作之前,它不会返回。所以没有办法取消它;没有队列。

如果您要生成大量彼此非常接近的通知(尤其是在同一个运行循环周期内),您可以使用NSNotificationQueueenqueueNotification 将它们合并。一般是这样的:

NSNotificationQueue.defaultQueue().enqueNotification(note, postingStyle: .whenIdle)

也就是说,如果这与按钮单击(人机交互)相关联,那么在计算机方面,通知可能相距甚远。半秒在计算机术语中是永恒的。如果是这种情况,您最好先在 UI 上控制它,方法是禁用该按钮,直到您愿意接受另一次点击(例如使用 button.enabled = false)。

可以编写一个包装器来合并任意时间段内的操作,但这在您的情况下可能会造成混淆,因为用户将能够单击系统将忽略的某些内容。如果这仍然是您想要的,我会看看是否能找到一个合并蹦床的示例(我已经用 ObjC 编写了它们,但我手头没有 Swift 示例)。

【讨论】:

  • 更好的方法。 OP 应该在 UI 本身防止这种情况发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2021-12-17
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多