Swift 用户界面不';如果不加载,代码仍然运行

Swift 用户界面不';如果不加载,代码仍然运行,swift,macos,cocoa,swift2,viewcontroller,Swift,Macos,Cocoa,Swift2,Viewcontroller,以下是违规代码: override func viewDidAppear() { super.viewDidAppear() doit("dave") } 作为一个背景,doit函数是一些将运行很长时间(天)的代码。当我运行这段代码时,应用程序会上下跳动一段时间,当它这样做时,doit函数中的print语句开始打印到控制台 但用户界面从未加载。应用程序图标保持在dock中,但没有我所称的“开放点” 如果我去掉这个函数,一切都会变好 我认为doit函数中的代码并不重要,因为视图应

以下是违规代码:

override func viewDidAppear() {
    super.viewDidAppear()
    doit("dave")
}
作为一个背景,doit函数是一些将运行很长时间(天)的代码。当我运行这段代码时,应用程序会上下跳动一段时间,当它这样做时,doit函数中的print语句开始打印到控制台

但用户界面从未加载。应用程序图标保持在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)
}
这两条语句打印时都不会出现视图


非常感谢您的帮助。

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

长时间运行的函数应该放在其他线程上。苹果提供了许多方法来实现这一点。GCD(即
dispatch\u async
和friends)或
NSOperation
可能是这方面的起点