确保主线程在后台线程处理时被阻塞的最佳方法是什么?

What is the best way to ensure the main thread is blocked while a background thread is processing?

考虑以下情况:

Main Thread -----UIView info \ --------------------------------------- / Button Updated ------
                              \ (Some Event)                          / (Some Event)
                               \                                     /
BG Thread ---------------------Validate UIView info-----Update Button------------------------
  1. 在主线程上,存在一个 UIView
  2. UIView 对后台线程进行调度调用
  3. 在 BG Thread 中,验证了 UIView 的信息。
  4. BG 线程对主线程上的 UIButton 进行调度调用以更新它。

我的问题是 - 请注意 UIView 信息和 UIButton 之间的差距,这意味着应用程序可以在这段时间内进行技术更新。我怎样才能阻止这种差距?本质上,从 BG 线程阻塞主线程直到调用返回?

你不能也绝不能阻塞主线程。如果这样做,界面将冻结,如果阻塞持续时间过长,WatchDog 进程将在用户眼前杀死您的应用程序。

您可以让用户感觉到正在发生某些事情,并阻止用户做任何事情,例如,关闭用户交互并放置一个微调器。但总的来说,是的,多线程很难;你必须做好准备,当应用程序改变状态时,你可能会回到主线程。

您的按钮不应在后台更新。您应该始终在主线程上修改 UIKit 个组件。

你也不应该阻塞主线程,你正在寻找的是向用户显示后台进程处于活动状态的指示。 'UIActivityIndicatorView' 向用户展示可能是一件好事,您还可以在视图上禁用用户交互,以防止用户触摸任何东西,如果这对他们来说至关重要,那就是等到操作完成但不推荐。

与其阻塞主线程,不如在您的视图中禁用用户输入控件,直到验证完成,然后重新启用它们。

添加一个 activity 指标并将 hidesWhenStopped 设置为 true 也是有意义的;如果您在后台工作开始时启动它,它将向用户显示正在进行的后台工作,并在验证完成时停止它。

如果后台进程有可能挂起或花费更长时间,例如如果它正在发出网络请求,您可能 show/enable 一个取消按钮和一种终止它的方法。

显示activity指示器和可能提供取消按钮都需要主线程保持运行,所以绝对不要阻止它!

是的,你永远不应该阻塞主线程并只在主线程上更新UI。

就是说 - 在后台忙碌时显示微调器/activity 指示器。

仔细考虑UI,例如呈现一些东西,以便用户在您忙于例如时无法更改某些东西。对话框或弹出窗口或类似的东西。

在实践中,这通常更像是一个用户体验问题,而不是阻塞问题。