2015-12-11 26 views
0

下面是有问题的代码:UI不加载,代码仍然运行

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

由于有点背景,DOIT功能是一些代码,将运行一个过长...时间(天)。当我运行这段代码时,应用程序会上下晃动一段时间,而当它这样做时,doit函数中的打印语句开始打印到控制台。

但是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) 
} 

两个语句打印而没有出现的视图。

任何帮助表示赞赏。

回答

0

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

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