UIAlertAction 处理程序延迟后运行

Posted

技术标签:

【中文标题】UIAlertAction 处理程序延迟后运行【英文标题】:UIAlertAction handler running after delay 【发布时间】:2015-09-07 15:18:57 【问题描述】:

我正在尝试将我的 UIAlertViews 更改为 UIAlertControllers。我为它设置了这个动作:

UIAlertAction *undoStopAction = [UIAlertAction actionWithTitle:@"Undo Stop"
                                                        style:UIAlertActionStyleDefault
                                                       handler:^(UIAlertAction *action) 
                                                           [self undoStop];
                                                       ];

但是,处理程序直到操作被点击后大约一秒钟才会运行。有什么办法可以加快速度吗?

【问题讨论】:

你在主线程上做点什么吗? 或者你是在后台方法/块中运行它 如果您没有使用主线程显示警报,请在主线程中执行。 一切都来自主线程。 这不是关于undoStop,因为我已经用单个NSLog替换了该行,并且延迟是相同的。即使从主控制器的 viewDidLoad 调用它,它仍然会发生。似乎 UIAlertAction 的处理程序总是被延迟。 【参考方案1】:

警报视图的短暂延迟是正常的(不过不到一秒)。如果这对您不方便,您可以通过编程方式创建一个带有标签和按钮的覆盖屏幕的视图,基本上是自定义的警报视图。

【讨论】:

谢谢。我以前将它作为 UIAlertView,在点击艺术按钮时具有特定的行为。那一直都是即时的。我想我现在会继续这样做,即使它已被弃用。【参考方案2】:

这里有一个半解决方案:

The handler of a UIAlertAction is a bit too late - how can I make it immediate?

基本上,子类化警报控制器并在 viewWillDisappear 上运行处理程序。您可以将处理程序块存储在警报控制器上。

此解决方案的问题在于,如果您使用 UIAlertAction 添加操作,则无法像您那样为每个按钮运行处理程序。所以这是一个主要的限制。

但是,这个解决方案对我有用(因为我试图在警报出现时在警报后面添加一个背景视图,并在警报消失时让它随着警报消失......最初我试图用按钮点击,但由于处理程序被延迟,这不起作用)。

【讨论】:

【参考方案3】:

正如 T 先生留下的评论所暗示的那样,处理程序可能没有在主线程上被调用,这可以解释延迟。尝试将您的处理程序代码嵌入:

dispatch_async(dispatch_get_main_queue()) 
<your code>

看看你是否仍然得到延迟。

【讨论】:

没有变化。似乎处理程序直到一秒钟后才执行。与我使用 UIAlertView 时的情况不同

以上是关于UIAlertAction 处理程序延迟后运行的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertAction 的处理程序有点太晚了——我怎样才能让它立即生效?

如何执行 UIAlertAction 的处理程序?

制作 UIAlertAction 处理程序的正确方法

未调用 UIAlertAction 处理程序

UIAlertAction - 处理动作

swift延迟后如何更新UI