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