[英]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.