2015-04-27 67 views
1

所以我試圖在我的應用程序中創建一些加載屏幕。我有一個需要3-10秒才能加載的視圖。在這段時間內,我想要顯示一個UIView,我只是用加載屏幕將其製作成黑色。目前我在super viewDidLoad之後將我的代碼放入viewDidLoad函數中。這裏是我的代碼在等待主視圖加載時顯示UIView?

UIView* baseView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
[self.view addSubview:baseView]; 
[baseView setBackgroundColor:[UIColor blackColor]]; 
[self.view bringSubviewToFront:baseView]; 
baseView.layer.zPosition = 1; 

這工作,並創建我的觀點凌駕一切正是我想要的,但是這個等待,直到我的主視圖是完全完成加載,它實際上顯示任何東西之前。 viewDidLoad不是一個放置這個的好地方,如果是的話我應該放在哪裏。

簡單地說,我有一個非常基本的UIView,我想加載,而我等待實際的視圖加載,然後簡單地隱藏它。任何想法如何做到這一點?

+0

爲什麼您認爲需要3-10秒鐘的加載? – Leo

+0

你在哪裏運行花費時間的代碼?這聽起來像你需要異步調度它 – Paulw11

+0

該視圖需要很長時間才能加載,因爲它需要下載大量的內容,我正在努力使所有內容都是異步的,但這更像是一種臨時性的修復,因爲我無法做到它大約一個月是異步的。 – CMOS

回答

2

您需要在另一個線程上調度您的辛勤工作,否則操作系統會在刷新UI之前等待所有過程完成(這就是您看到加載屏幕僅在3-10秒後纔出現的原因)。

不要忘記在冗長的工作完成後重新回到主線程。所有UI更新必須在主線程上完成。

self.loadingView.hidden = NO; 
// Dispatch lengthy stuff on another thread 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    // Do lengthy stuff here 

    // Dispatch back on the main thread (mandatory for UI updates) 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.loadingView.hidden = YES; 
    }); 
}); 
+0

或者如果你真的想要在主線程上執行冗長的工作,我想你可以使用'''self performSelector:@selector(lengthyJobMethod)withObject:nil afterDelay:0]'''來允許你的加載查看要顯示的時間,但我強烈建議將你的東西移動到'''dispatch_async'''中。 – Rufel

0
UIView* baseView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
[self.view addSubview:baseView]; 
[baseView setBackgroundColor:[UIColor blackColor]]; 
[self.view bringSubviewToFront:baseView]; 
baseView.layer.zPosition = 1; 

//Create new dispatch for load data 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    // Load data in here 

    // Call main thread to update UI 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     baseView.hidden = YES; 
    }); 
});