2017-08-12 61 views
0

在viewDidLoad中()第一的ViewController,有2個操作:如何加快我的請求以啓用導航項目中的酒吧按鈕項目?

  1. 提出buttonGo.isEnabled =假(buttonGo是欄按鈕的項目)
  2. 發出請求時,通過web服務來檢查設備被授權。

檢查設備是否被授權是在單例類委託內完成的。它調用:獲得委託方法的DownloadAuthorize:updateView()。

如果設備授權,我將回調委託方法的UpdateView()在視圖控制器和該方法使得buttonGo.isEnabled =真

一切都運行良好,但buttonGo那張幾秒鐘後啓用。我以這種方式進行調查,在我看來,buttonGo會被後臺線程啓用。我試圖在委託方法中使用view.setNeedsLayout(),view.setNeedsDisplay(),因爲我希望加快重繪組件的速度,但我得到類似這樣的錯誤: 「此應用程序正在從後臺線程修改自動佈局引擎之後從主線程訪問引擎,這可能會導致引擎損壞和奇怪的崩潰「

是否有可能做一些事情來加快控件刷新?

謝謝

+0

請參考[this](https://stackoverflow.com/a/39712843/1746086)鏈接,檢查約束是否更新。 – shahnilay86

回答

1

這顯然完成的,因爲它是被修改自動版式UI元素的代碼/從其是在後臺線程或完成處理程序運行的代碼約束。所有完成處理程序默認在後臺線程中運行。您需要使用GCD從完成處理程序塊更新UI元素。

DispatchQueue.main.async { // UI update/changes task here } 
+0

謝謝你的回答,但也許我錯過了一些東西,或者我解釋得很糟糕。按鈕Go必須保持禁用狀態,直到它收到授權。當授權是好的,那麼按鈕將啓用。我知道,只有當方法委託updateView()被正確調用時,授權纔是正確的。 – Ziggy

+0

@Ziggy那麼你解決了你的問題? – Jaydeep

+0

謝謝,Jaydeep和Bhadresh。現在看來我解決了。在方法updateView()內部,我提出了你的建議,現在看起來工作得很好。感謝@Nilay,他向我展示瞭如何應用這一變化的正確方法 – Ziggy

0

在主線程中調用您的方法。

DispatchQueue.main.async { 
     updateView() 
} 
+0

謝謝你的回答,但也許我錯過了一些東西,或者我解釋得很糟糕。按鈕Go必須保持禁用狀態,直到它收到授權。當授權是好的,那麼按鈕將啓用。我知道當方法委託updateView()被正確調用時,授權是很好的。 – Ziggy

相關問題