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 未加载,代码仍在运行的主要内容,如果未能解决你的问题,请参考以下文章