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

Ios 当后台线程正在处理时,确保主线程被阻塞的最佳方法是什么?,ios,objective-c,grand-central-dispatch,Ios,Objective C,Grand Central Dispatch,考虑以下情况: Main Thread -----UIView info \ --------------------------------------- / Button Updated ------ \ (Some Event) / (Some Event) \

考虑以下情况:

Main Thread -----UIView info \ --------------------------------------- / Button Updated ------
                              \ (Some Event)                          / (Some Event)
                               \                                     /
BG Thread ---------------------Validate UIView info-----Update Button------------------------
  • 在主线程上,存在一个UIView
  • UIView向后台线程发出分派调用
  • 在BG线程中,验证UIView的信息
  • BG线程向主线程上的UIButton发出调度调用以更新它

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

    您不能也决不能阻止主线程。如果你这样做,界面就会冻结,如果阻塞持续太久,看门狗进程会在用户眼前杀死你的应用程序


    您可以通过关闭用户交互和设置微调器,让用户感觉正在发生什么事情,并阻止用户做任何事情。但总的来说,是的,多线程是很难的;当应用程序状态发生变化时,您必须做好返回主线程的准备。

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


    您也不应该阻止主线程,您要寻找的是向用户显示后台进程处于活动状态的指示UIActivityIndicatorView’可能是向用户展示的一件好事,您还可以禁用视图上的用户交互,以防止用户触摸任何东西,前提是他们必须等待操作完成,但不建议这样做。

    而不是阻止主线程,禁用视图中的用户输入控件,直到验证完成,然后重新启用它们

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

    如果后台进程可能挂起或需要更长时间,例如,如果它正在发出网络请求,您可能会显示/启用“取消”按钮以及终止该按钮的方法


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

    是的,您永远不应该阻止主线程并仅在主线程上更新UI

    也就是说,在后台忙时显示微调器/活动指示器

    仔细考虑用户界面,例如呈现一些内容,以便用户在您忙于使用对话框、popover或类似内容时无法更改某些内容


    实际上,这更多的是用户体验问题,而不是阻塞问题。

    谢谢@matt-非常感谢您关注这个问题。延迟永远不会超过一秒钟。这更多是为了内部验证。在这种情况下,显示微调器的临时界面听起来是一个不错的解决方案。我回答这个问题的目的只是想劝阻你不要以为你可以在离开主线程并稍后返回时以某种方式保证应用程序的状态。你永远不能那样做;你的应用程序是事件驱动的,这意味着只要你的主线程代码没有运行,事情就可以自由发生。一个人必须学会用这些术语来思考。延迟永远不会超过一秒钟——它主要用于内部处理。正如其他人所说,你永远不会“阻塞”主线程。如有必要,当异步过程正在进行时,您可以暂时(a)禁用用户交互;和/或(b)显示异步过程正在进行的一些视觉指示,并在完成后重新启用。