3 回答

TA貢獻1982條經驗 獲得超2個贊
通常將塊分配到主隊列是從后臺隊列完成的,以表示某些后臺處理已完成,例如
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
在這種情況下,我們將在后臺隊列上進行冗長的計算,并且需要在計算完成后更新UI。通常必須從主隊列中完成UI的更新,因此我們使用第二個嵌套的dispatch_async將其“信號”回到主隊列。
可能還有其他一些示例,您可能希望將其分派回主隊列,但是通常以這種方式完成,即從分派到后臺隊列的塊中嵌套。
后臺處理完成->更新UI
在后臺隊列上處理的數據塊->信號主隊列以開始下一個塊
后臺隊列上的傳入網絡數據->通知主隊列消息已到達
等
至于為什么您可能希望從主隊列中分派到主隊列中呢……好吧,盡管可以想象,您可能不會這樣做以安排一些工作在下次運行循環中進行。

TA貢獻1852條經驗 獲得超7個贊
從主線程調度塊到主隊列可以是有用的。它使主隊列有機會處理已排隊的其他塊,這樣您就不會簡單地阻止其他所有對象的執行。
例如,您可以編寫一個本質上是單線程的服務器,該服務器仍然可以處理許多并發連接。只要隊列中沒有任何單個塊花費太長時間,服務器就會保持對新請求的響應。
如果您的程序只花一生時間來響應事件,那么什么都不做,那么這很自然。您只需將事件處理程序設置為在主隊列上運行,然后調用dispatch_main(),就根本不必擔心線程安全。

TA貢獻1993條經驗 獲得超6個贊
希望我能正確理解您的問題,因為您想知道dispatch_async和dispatch_sync之間的區別?
dispatch_async
將異步地將塊分配到隊列。這意味著它將繼續將塊發送到隊列,而無需等待其返回,然后繼續執行方法中剩余的代碼。
dispatch_sync
將同步將塊分配到隊列。這將防止在該塊執行完之前再執行該方法中剩余的代碼。
我大部分dispatch_async時間都在后臺隊列中使用a 來擺脫主隊列的工作,并利用設備可能具有的任何額外核心。然后dispatch_async,如果需要更新UI,請轉到主線程。
- 3 回答
- 0 關注
- 488 瀏覽
添加回答
舉報