簡體   English   中英

為什么在 swift 的 mac 命令行工具中使用 DispatchQueue.main.async 時需要運行循環?

[英]Why run loop is needed when using DispatchQueue.main.async in mac command line tool in swift?

我找到了 Apple 的文檔來理解為什么我應該使用運行循環來實現主調度隊列中的任務。

根據蘋果文檔

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

但是,我仍然無法理解“為什么”需要運行循環。 聽起來像是“它需要運行循環,因為它需要運行循環”。 如果有人向我解釋這一點,我將不勝感激。 謝謝你。

DispatchQueue.main.async是當您在后台隊列上運行代碼並且您需要在主隊列上執行特定的代碼塊時。

在您的代碼中, viewDidLoad已經在主隊列上運行,因此幾乎沒有理由使用 DispatchQueue.main.async。

但是使用它不一定是錯誤的。 但它確實改變了執行順序。

在當前運行循環完成后,異步閉包排隊運行。

為什么我應該使用運行循環來實現主調度隊列中的任務

通常,您不需要,因為您已經在使用一個!

在一個應用程序項目中,已經有一個主隊列運行循環。 例如,iOS 應用程序項目實際上只是對 UIApplicationMain 的一次巨大調用,它提供了一個運行循環。

這就是它能夠坐在那里等待用戶做某事的方式。 運行循環正在運行。 和循環。

但是,比如說,在 Mac 命令行工具中,沒有自動運行循環。 它運行其主 function 並立即退出。 如果您需要它不這樣做,您將提供一個運行循環。

我不明白“為什么”需要運行循環

通常,命令行應用程序不需要運行循環。 如果您有特殊需要,您可以使用運行循環(例如,您有一些在等待用戶輸入時正在執行某些任務的動態 UI),但絕大多數命令行應用程序不需要運行循環。

正如文檔所說:

運行循環是一個事件處理循環,用於安排工作和協調接收傳入事件。 運行循環的目的是在有工作要做時讓你的線程保持忙碌,並在沒有工作時讓你的線程進入睡眠狀態。

因此,如果您需要讓您的應用程序等待一些傳入事件,或者您在隊列之間異步調度任務,那么可以使用運行循環,否則,請不要打擾。 大多數命令行應用程序根本不需要使用運行循環。

暫無
暫無

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

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