我们可以在单个应用程序中创建多个主线程吗? 为什么在主线程中进行所有UI更改?
我在采访中遇到过这些问题。我无法找到任何解决方案。任何人都可以帮我找到这个问题的答案吗?这将有助于我在iOS应用程序的未来访谈和实现。
提前致谢!
答案 0 :(得分:1)
您的应用程序中只有一个主线程,但是多个调度队列中的任务可能在此线程上执行。在主队列上调度的任务保证在主线程上运行。
通常使用GCD,您不会考虑线程,而是考虑从底层线程中抽象出来的队列。它们提供了一定程度的抽象,可以更轻松地管理任务,而无需担心正在使用的线程的数量或状态。
自动布局引擎执行大量计算并应用规则以获得布局解决方案。如果UI元素的属性发生更改,则自动布局解决方案将失效,需要重新计算。
由于主队列是串行调度队列,因此将UI更新分派到主队列可确保正在执行自动布局计算或正在更新UI属性,但不能同时更新两者(当然,主队列上不仅仅发生了这两个活动,但我们只是在这里解决自动布局问题)
答案 1 :(得分:0)
不,系统为应用程序创建的应用程序只有一个主线程。主线程是直接向用户提供更改的线程。可以说直接与用户连接的线程。
检查Apple Documentation,它说明,
主队列由系统自动创建,并与应用程序的主线程相关联。您的应用程序使用以下三种方法中的一种(且仅一种)来调用提交到主队列的块:
调用dispatch_main
调用UIApplicationMain(iOS)或NSApplicationMain(OS X)
在主线程上使用CFRunLoopRef
与全局并发队列一样,调用dispatch_suspend, dispatch_resume,dispatch_set_context等没有任何效果 当与此函数返回的队列一起使用时。
现在,让我们举个例子,如果您正在下载图像并想要将其显示给用户。现在如果您将在主线程上下载它,它将阻止其他UI
直到它完成下载。因此,您不应该在主线程上或同步下载它。你应该异步下载它,当下载完成后,你应该在main thread
上显示给用户,这样下载完成后它会快速显示给用户。