0

我有2種基本方法 - viewDidLoadviewDidAppear。根據我的應用哲學,當視圖控制器加載時,它從基本數據中提取數據,並開始用一些謂詞對其進行分類。提取過程很長,所以我將它發送到全局隊列。當我的視圖出現時,它顯然不會從數組(在load方法中編譯)獲取值並崩潰。所以我需要viewDidAppear等到至少有一個對象被添加到數組中。 信號量或臨時值的種類? 在此先感謝!簡單的等待來自異步線程的值

P.S.數組中的每個項目都表示包含構成UI的數據的結構。用戶與此UI交互,因此必須使用數組中的第一項加載一次。要切換到下一個項目,用戶只需點擊「下一步」,UI就會根據數組中的下一個項目進行更改。這就是爲什麼我想要數據在後臺獲取並允許用戶立即工作。 (這是不可能的5日,10日或1001個元素立即跳轉,將有足夠的時間用戶上這些頁碼之前獲取數據)你應該使用嵌套

PPS仍然沒有正確的決定:(

+2

告訴,不要問使用異步完成塊,並設置數據陣列/重載在完成塊表視圖 – vadian

+0

@vadian不幸的是它會「凍結」與接口。長時間「進度條」加載 –

+0

你的用戶界面不應該依賴於被取出的數據,假設互聯網c連接將不可用。即使在這種情況下,你的用戶界面也應該有反應顯示一些佔位符或空數據,直到真實數據可用。 – user3441734

回答

0

調度塊,像這樣:

func fetch(completion block:(() -> Void)?) { 
    // Run fetch on background thread, to prevent the main thread (and hence your UI) from being 'blocked'. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     // 
     // Fetch data... 
     // 

     dispatch_async(dispatch_get_main_queue(), { 
      block?() 
     }) 
    }) 
} 

fetch(completion: { 
    // Update your UI 
}) 
+0

是的,我想過,但據我瞭解,它會在每個項目後更新UI,並附加到數組中。我平均有3000-5000件物品。在1秒內它可以獲得5-10項,所以我會看到5-10個UI更新?實際上,每個項目都代表帶有數據的結構。我用來自item結構的數據編寫整個UI。用戶可以與這些數據進行交互:編寫一些文本,點擊一些觸發器,所以如果UI將被刷新,用戶可以放鬆一些工作過程。 –

+0

在這種情況下,您可以選擇:您可以首先獲取所有數據(這可能需要一段時間),也可以「逐步」加載UI。我的意思是說你有1000個項目,每個項目都取決於你提取的數據。你應該在它的位置加載一個視圖*,它是「臨時的」。然後,當數據被提取時,你在它的地方加載* actual *視圖。這樣,用戶可以與依賴於已經獲取的數據的UI組件進行交互,而其他組件仍在加載。希望這可以幫助! – Jason

+0

這似乎是最簡單的方法,但由於某些原因,等待時間可能會持續太長時間,用戶會坐在進度條中看。這就是問題所在,我希望用戶立即開始工作 –