我刚刚意识到过早地在警报控制器上调用解雇会导致他们不被解雇。例如,如果我出现警报控制器,然后立即尝试将其解除,则忽略该解除。例如
// Done in viewDidLoad
let alertController = UIAlertController(title: nil, message: "Connecting to Bubble Centerpiece...\n\n", preferredStyle: .alert)
present(alertController, animated: true, completion: nil)
alertController.dismiss(animated: true, completion: nil)
使用此代码,AlertController不会被解雇。在我的情况下,我的被解雇通常在警报控制器出现后大约0.5秒内被调用,并且没有被解雇。我必须手动延迟这样的解散代码才能使其正常工作。
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: { self.alertController.dismiss(animated: true, completion: nil)})
我的假设是警报控制器需要一些时间才能正确设置,如果解雇呼叫的到达时间早于实际显示的警报,那么它将不会被解雇。我想知道是否有一个更优雅的解决方案,而不是用DispatchQueue延迟它。
答案 0 :(得分:3)
因为,只要您通过animated: true
,警报控制器就不会在层次结构中进行动画处理,因此在此之前您无法解除警报。这正是completion
块的用法(通常,任何好的API,其中发生的事情异步将为您提供一个完成块,让您知道该操作何时完成)。您可以通过以下方式立即解雇(尽管我不会想象这是一个有价值的真实用例):
present(alertController, animated: true, completion: {
alertController.dismiss(animated: true, completion: nil)
})