簡體   English   中英

如果主隊列始終保持同步,為什么dispatchQueue.main會給我提供sync或async的選項

[英]Why does dispatchQueue.main give me the option of sync or async if main queue is always sync

如果主隊列始終保持同步,為什么dispatchQueue.main會給我提供sync或async的選項

dispatchQueue.main.async{
    //code
}

dispatchQueue.main.async{
    //code
}

是相同的

dispatchQueue.main.sync{
    //code
}

dispatchQueue.main.sync{
    //code
}

所以我想知道是否有任何區別

無論您可以同步還是異步將main隊列加入隊列, main隊列都與其他隊列沒有什么不同。

您必須遵守的唯一規則是,永遠不要使用sync將某些內容排隊到當前正在使用的同一隊列中。 這將導致死鎖。 同樣,無論隊列是主隊列還是其他隊列,都是如此。

要回答您的問題“與...相同” -不,它不相同。 假設從某個后台隊列調用了這兩組代碼,則在第一組代碼中,后台隊列將繼續前進,而無需考慮兩個塊最終何時在主隊列上執行。 在第二組代碼中(使用sync ),背景隊列每次都阻塞,直到每個代碼塊在主隊列上運行。

如果從主隊列中調用了這兩組代碼,則存在更大的差異。 第一組代碼(帶有async )保持工作。 第二組代碼(帶有sync )將導致主隊列在第一次sync調用時阻塞,並且您的應用將變得無響應,直到用戶(或操作系統)將其殺死。

主隊列和其他隊列之間唯一可能相關的區別是,主隊列始終是串行隊列,而后台隊列可以是串行或並發。 但是只要避免在兩個隊列相同的地方使用sync ,兩者都可以有效地使用syncasync

異步 :非阻塞,在不久的將來被安排在該特定隊列上的某個地方。

同步 :立即在該特定隊列上執行。

您所說的是在主線程上執行代碼並在同一隊列上分派asynchronoussynchronous內容的情況。 對於async這沒問題,因為在該隊列上有時隙可用時,該塊將在不久的將來被調度。 但是,在與被調用的隊列相同的隊列上執行的sync塊可能會死鎖。

這不僅適用於主隊列,還適用於任何其他隊列,因此,如果要同步調度到一個隊列,請確保多數民眾贊成在另一個隊列中,而不是在當前正在處理的隊列中。

暫無
暫無

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

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