【问题标题】:iOS application have multiple main thread [closed]iOS应用程序有多个主线程[关闭]
【发布时间】:2017-01-06 16:46:04
【问题描述】:

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

我在采访中遇到过这些问题。我找不到任何解决方案。谁能帮我找到这个问题的答案?这将有助于我以后在 iOS 应用中进行面试和实施。

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    您的应用程序中只有一个主线程,但是来自多个调度队列的任务可能在该线程上执行。在主队列上调度的任务保证在主线程上运行。

    通常使用 GCD,您不会考虑线程,而是从底层线程抽象出来的队列。它们提供了一个抽象级别,可以更轻松地管理任务,而无需担心正在使用的线程的数量或状态。

    自动布局引擎会执行大量计算并应用规则以得出布局解决方案。如果 UI 元素的属性发生更改,则自动布局解决方案无效,需要重新计算。

    由于主队列是串行调度队列,因此将 UI 更新调度到主队列可确保正在执行自动布局计算正在更新 UI 属性,但不能同时更新两者(当然主队列上发生的不仅仅是这两个活动,但我们只是在这里解决自动布局)

    【讨论】:

      【解决方案2】:

      不,系统为应用程序创建的应用程序只有一个主线程。主线程是直接给用户更改的线程。可以说直接与用户连接的线程。

      检查Apple Documentation,它指出,

      主队列由系统自动创建并与应用程序的主线程相关联。您的应用程序使用以下三种方法中的一种(并且仅一种)来调用提交到主队列的块:

      • 调用 dispatch_main

      • 调用 UIApplicationMain (iOS) 或 NSApplicationMain (OS X)

      • 在主线程上使用 CFRunLoopRef

      与全局并发队列一样,调用 dispatch_suspend, dispatch_resume、dispatch_set_context 等没有效果 与此函数返回的队列一起使用时。

      现在,让我们举个例子,如果您正在下载图像并希望将其显示给用户。现在,如果您将在主线程上下载它,那么它将阻止其他 UI 直到完成下载。所以,你不应该在主线程或同步下载它。异步下载,下载完成后在main thread上显示给用户,下载完成后会快速显示给用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-22
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多