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
可能是这方面的起点