UI 未加载,代码仍在运行

Posted

技术标签:

【中文标题】UI 未加载,代码仍在运行【英文标题】:UI doesn't load, code still runs 【发布时间】:2015-12-11 06:20:57 【问题描述】:

下面是有问题的代码:

override func viewDidAppear() 
    super.viewDidAppear()
    doit("dave")

作为背景知识,doit 函数是一些将运行很长时间(几天)的代码。当我运行此代码时,应用程序会上下弹跳一段时间,并且在执行此操作时,doit 函数中的打印语句开始打印到控制台。

但用户界面永远不会加载。应用程序图标保留在 Dock 中,但没有我所说的“开放点”。

如果我取出函数,一切都会正常。

我认为 doit 函数中的代码并不重要,因为视图应该在它运行之前就出现了。我也在 viewDidLayout 和 viewDidLoad 中尝试过,结果相同。

为了好玩,我这样做了:

override func viewDidLoad() 
    super.viewDidLoad()
    print(1)


    // Do any additional setup after loading the view.


override func viewDidLayout() 
    super.viewDidLayout()
    print(2)

两个语句都打印,但视图从未出现过。

感谢任何帮助。

【问题讨论】:

【参考方案1】:

如果doit 运行了很长时间,您的问题是您阻塞了主线程。所有与 UI 相关的事情都在那里发生,但它不会发生,因为您的 doit 函数仍然很忙,并且 UI 必须等到它完成。您的 UI 不会出现,因为 viewDidLoad 永远不会返回,并且它必须在其他主线程任务发生之前返回。

长时间运行的函数应该放在其他线程上。 Apple 提供了多种方法来做到这一点。 GCD(即dispatch_async 和朋友)或NSOperation 都可能是这方面的起点。

【讨论】:

以上是关于UI 未加载,代码仍在运行的主要内容,如果未能解决你的问题,请参考以下文章

iOS 启动屏幕代码未运行

运行时带有加载光标的openGL GLFW白屏

保存后重新加载

情节提要未加载GUI但仍在编译[重复]

UI应用程序未加载PyQt5

Swift:PrepareForSegue 正在运行但未加载 ViewController