2015-12-11 116 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可能是此的起點。