iOS应用程序有多个主线程

时间:2016-08-30 11:54:25

标签: ios objective-c iphone multithreading user-interface

我们可以在单个应用程序中创建多个主线程吗? 为什么在主线程中进行所有UI更改?

我在采访中遇到过这些问题。我无法找到任何解决方案。任何人都可以帮我找到这个问题的答案吗?这将有助于我在iOS应用程序的未来访谈和实现。

提前致谢!

2 个答案:

答案 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上显示给用户,这样下载完成后它会快速显示给用户。