【问题标题】:UIAlertAction handler block and main threadUIAlertAction 处理程序块和主线程
【发布时间】:2021-04-12 20:35:42
【问题描述】:

场景:呈现给用户的 UIAlertController 具有一个按钮,以及一个更新 UI 以指示按下按钮的处理程序块。处理程序块中的代码被包裹在一个 dispatch_async 中,以确保代码在主线程上运行。

问题:代码审查员说 dispatch_async 是不必要的,但我们都找不到支持它的引用。关于处理程序的 Apple 文档只说

handler 当用户选择动作时执行的块。该块没有返回值,并将选定的操作对象作为其唯一参数。

我找不到任何可以保证他的立场的东西——UIAlertAction 处理程序块将始终在主线程上运行——是正确的,在没有这样的情况下,我倾向于保留 dispatch_async。无论哪种方式都有明确的说法吗?

【问题讨论】:

  • 处理程序块被执行以响应用户交互;点击按钮。 UI 交互总是发生在主线程上。正如您不需要在@IBAction 中分派到主线程一样,您也不需要在此处分派。审稿人是对的。
  • 您可以对其进行测试——尝试在没有dispatch_async 的情况下运行代码。如果主线程检查器没有捕捉到线程错误,那你就没事了。
  • @Paulw11 - 我认为问题不是“他是否正确”,而是“是否保证正确”?
  • 保证是UI交互。

标签: ios objective-c objective-c-blocks uialertaction


【解决方案1】:

“明确的声明”是 Paulw11 已经引用的事实:所有用户交互都发生在主线程上。对于 iOS 编程来说,保证这一事实至关重要;没有它,整个运行时都会崩溃。除了记录在无处不在之外,不需要记录它。

因此,除非您要找到一些邪恶的方法来以编程方式在主线程之外运行此方法,否则它会运行的唯一方法是因为用户点击了按钮,因此您确实可以保证在主线程上。你应该改变你的倾向;额外的调度是不必要的浪费。

另一种看待它的方式:只要你冒着被从主线程回调的风险,Apple 就会记录下来。他们在这里不这样做,所以没有这样的风险。

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多