簡體   English   中英

我們需要在主線程或主隊列中更新UI嗎?

[英]Do we need to update UI in main thread or in main queue?

我讀了很多文章,指出我們需要更新主線程中的UI,但是每當我更新我的UI時總是代碼。

DispatchQueue.main反過來給了我Queue而不是線程。 我將如何訪問該線程或兩者是一樣的?

想象一下火車站,火車的數量與它離開的平台的數量相同。

因此,如果您想要#1列車,那么您就站在#1平台上。 沒有先站在平台上就無法上火車。 其他想乘坐這列火車的人也站在平台上等待他們上火車的機會。

火車是線程。 平台就是隊列。

如果你想進入主線程,請進入主隊列。

DispatchQueue管理特定線程上代碼的執行。

來自Apple文檔:

DispatchQueue管理工作項的執行。 提交到隊列的每個工作項都在系統管理的線程池上處理。

所以,當你打電話的時候

DispatchQueue.main.async {
        //your code
}

此代碼將提交到main隊列,而main隊列又在主線程上運行。

從並發編程指南中的Dispatch Queues

主調度隊列

主調度隊列是一個全局可用的串行隊列,它在應用程序的主線程上執行任務。 此隊列與應用程序的運行循環(如果存在)一起工作,以將排隊任務的執行與附加到運行循環的其他事件源的執行交錯​​。 因為它在應用程序的主線程上運行,所以主隊列通常用作應用程序的關鍵同步點。

通常,GCD維護一個線程池,並且調度隊列和線程之間沒有1-1關系。 但主隊列是特殊的:它綁定到主線程,調度到主隊列的所有項都在主線程上執行。 (對於OperationQueue.main也是如此。)

將代碼調度到DispatchQueue.main (或OperationQueue.main )可確保它在主線程上執行,並與其他UI更新同步。

在這個意義上,術語“在主線程上執行”和“在主隊列上執行”通常可互換使用。

//主線程

DispatchQueue.main.async
{ 
 //eg. 
 tableview.reloadData()
  // here you update your UI.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM