簡體   English   中英

當某些東西異步運行時,是否意味着它不在主線程上?

[英]when something is run asynchronously does it mean that it's not on the main thread?

我對異步加載和主線程的概念有些困惑。 當某些內容異步加載時,是否表示它不在主線程上運行? 據我所知,這是兩個不同的概念,某些內容可以異步在主線程上運行,某些內容也可以異步在后台/輔助線程上運行。 如果我錯了,請糾正我。

不完全的。 異步運行意味着它不會停止在當前線程上繼續執行。 這是一個重要的區別,因為完全有可能異步執行某項操作,使其最終結束在主線程上(例如:dispatch_async(dispatch_get_main_queue(),^ {some block});),這意味着它不會停止其他操作線程繼續執行,但阻塞了主線程。

因為主線程對應用程序非常重要,所以異步代碼最常見的用法是避免阻塞它,但這不是唯一的用法。

(已添加)

也許用“關於x的異步”來思考它會更有用。 如果執行此操作,例如:

dispatch_async(aSerialQueue, ^{
    work();
    work();
});

然后,工作的兩個調用相對於彼此是同步的,並且相對於aSerialQueue上的所有其他工作都是同步的,而相對於其他所有事物都是異步的。

異步運行某些東西只是意味着調用可能在任務完成之前返回。 這可能是因為它在后台線程上運行。 可能是因為它將稍后在當前線程上發生。

同步運行某些內容並不意味着它將在主線程上發生。 這意味着直到任務完成,呼叫才會返回。 那可能是因為它發生在同一線程上。 可能是因為它發生在另一個線程上,但是您希望當前線程等待另一個線程完成。

此外,請注意, 線程和當前線程之間存在差異。 在后台線程上調用的同步任務將阻止該后台線程繼續運行,直到任務完成為止,但完全不會阻塞主線程。

當然,大多數時候,在iOS中,您的代碼將在主線程上運行。 但是您可以將工作推送到后台線程上(例如,使用dispatch API),因此區別很重要。

主線程是執行大部分代碼(包括所有UI)的位置。 還有其他線程,例如Web線程和網絡線程,您可以創建自己的線程。

同步與異步是何時執行代碼的問題。 您可以在主線程或任何其他線程上執行代碼的同步或異步塊。 如果同步,它將阻塞線程的其余部分,直到完成為止。 如果它是異步的,則只要線程從當前執行的操作中釋放出來,它將運行。

暫無
暫無

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

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