UI无法加载,代码仍然运行

时间:2015-12-11 06:20:57

标签: swift macos cocoa swift2 viewcontroller

以下是有问题的代码:

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

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

但UI永远不会加载。应用程序图标停留在停靠栏中,但没有"打开点"我称之为。

如果我取出这个功能,一切都会很好。

我无法认为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 个答案:

答案 0 :(得分:0)

如果doit运行了很长时间,那么您的问题是您正在阻止主线程。与UI相关的所有内容都会在那里发生,但它不会发生,因为您的doit函数仍然很忙,并且UI必须等到它完成。您的用户界面无法显示,因为viewDidLoad永远不会返回,并且必须才能返回其他主线程任务。

长时间运行的函数应放在其他线程上。 Apple提供了许多方法来实现这一目标。 GCD(即dispatch_async和朋友)或NSOperation可能是此的起点。