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

问题描述 投票:0回答:2

考虑以下情况:

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

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

ios objective-c grand-central-dispatch
2个回答
1
投票

您不能而且绝对不能阻塞主线程。如果这样做,界面将冻结,并且如果阻塞持续时间过长,WatchDog进程将杀死您的应用,而这在用户的视线之前就已经消失了。

例如,您可以通过关闭用户交互并设置微调器来使用户感觉正在发生某种事情,并阻止用户执行任何操作。但是总的来说,是的,多线程很难实现。您必须为在应用程序更改状态后回到主线程的可能性做好准备。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.