2017-06-17 90 views
0

我目前正在使用swift和xcode爲iPhone編程測驗應用程序。自從一個星期以來,我一直存在一個問題,我無法如此解決到今天。Swift:Gui沒有更新/太晚

小背景資料:

所有問題都在服務器上在線保存時間剛剛好被下載。這些問題總是包含圖像,因此需要一些時間來加載它們。這就是爲什麼我在用戶仍在思考當前問題時在後臺加載下一個問題的原因。因此,我使用類問題加載器,它延伸線程

問題情境:

當用戶回答問題,並按下繼續 - 按鈕,功能goToNextQuestion()被觸發,顯示給用戶的下一個問題。下一個問題的預加載完成,它可以立即顯示或下一個問題仍在加載,我們必須等待。

問題:

現在,如果我們要等待,我想顯示加載標籤和-Indicator。兩者都在gui中(與界面構建者一起放置)並隱藏在當時。我不喜歡這樣寫道:

func goToNextQuestion() 
{ 
    //check if next question is already ready 
    if (nextQuestionLoader.isFinished==false) 
    { 
     //not ready, so wait and show waiting indication 
     labelLoading.isHidden = false 
     loadingIndicator.startAnimating() 
     while(nextQuestionLoader.isFinished == false) {} 
     //question i now ready, hide waiting indication 
     labelLoading.isHidden = true 
     loadingIndicator.stopAnimating() 
    } 

    //so next question is ready and all good 
} 

我希望發生的是,當用戶按下繼續和接下來的問題是還沒有準備好,那loadingIndicatorlabelLoading顯示,直到問題已準備就緒。

現在發生的是,繼續被按下沒有任何顯示,gui被阻止util使用問題已經準備好,那麼它顯示下一個問題,同樣的事情發生在下面的問題。

Screenshots of the area of my gui that is concerned for better visualitzation (對不起,不同數量的截圖獲得的積分的,沒有這個問題做的,只需2個不同的截屏)

所以GUI更新的問題之前,不會發生被加載完全並且不會立即發生!

其他信息

  • 我試着在代碼的其他點的負載指標顯示,他們表現出正確的,所以不存在問題與此有關。
  • 當我把打印-命令之前和之後的while循環,並跟隨輸出在終端,我看到print-commands在while循環之前和之後正確執行。但gui更新只發生在
  • 函數goToNextQuestion完全在主線程中執行!

那麼,怎樣才能實現我的負荷,指示直接顯示和顯示後,while循環等待另一個線程的結束?

我真的很絕望,因爲我根本不知道如何解決這個問題。

我真的很感謝你的幫助!

非常感謝您的時間!

回答

0

你的方法有幾個問題。

首先,您不應該使用NSThread/Thread。系統類URLSession爲您處理異步下載。 (並且創建線程很昂貴並且容易出錯。)改爲使用URLSession。你應該能夠在網上找到很多例子,包括這裏。

其次,你可以像你與你的

while(nextQuestionLoader.isFinished == false) {} 

代碼做不阻塞主線程。由於您的下載在後臺線程上運行,它將繼續運行,但通過阻止主線程,所有內容都將凍結,直到下載完成。在下載完成之前,您的UI更改無法在屏幕上繪製。

你應該做的是使用URLSession使用委託方法或完成閉包。它支持這兩種方法。

我在Github上有一個名爲Async_demo的項目,其中包含顯示如何使用URLSession的工作代碼。這是一個簡單的例子,但它應該讓你開始。

+0

感謝您的回答!我會嘗試。 – LemonGraZ