gpt4 book ai didi

ios - 嵌套的 DispatchQueue.main.async

转载 作者:行者123 更新时间:2023-11-28 10:05:07 25 4
gpt4 key购买 nike

我在从 VC 调用的函数中显示警报。我不希望主 VC 被阻止。我正在异步调用此警报功能。该函数又具有另一个异步。这是好的做法还是我做错了?

任何人都可以建议遵循代码的良好做法吗?

class MyVC: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

// Don't block main thread
DispatchQueue.main.async {
self.showAlert(title: "Title", message: "Message")
}

// Do other stuff ...

}
}

func showAlert(title: String = "", message: String) {

alert = UIAlertController(title: title,message: message, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
alert.addAction(cancelAction)

DispatchQueue.main.async {
UIApplication.shared.keyWindow?.rootViewController!.present(alert, animated: true, completion: nil)
}
}

最佳答案

显示警报不会阻塞线程。 present(_:animated:completion:) 不是阻塞操作,因此没有理由添加任何这些 .async 调用。

也就是说,您不会想尝试在 viewDidLoad 中显示警报。那还为时过早。你的 View Controller 还没有出现在屏幕上。您应该将 showAlert() 放在 viewDidAppear 中,并删除所有 .async 调用。

作为一般规则,这些类型的模态警报在任何情况下都应该是最后的手段,尤其是当 View Controller 出现在屏幕上时。通常,您应该将要呈现给用户的任何消息集成到 View 本身中,而不是阻塞整个 UI。但是,如果警报是适当的(有时是),那么只要您在主队列中,就可以直接显示它们。

关于ios - 嵌套的 DispatchQueue.main.async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55108376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com