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 处理程序延迟后运行的主要内容,如果未能解决你的问题,请参考以下文章