3 回答

TA貢獻1982條經(jīng)驗 獲得超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
在后臺隊列上處理的數(shù)據(jù)塊->信號主隊列以開始下一個塊
后臺隊列上的傳入網(wǎng)絡(luò)數(shù)據(jù)->通知主隊列消息已到達
等
至于為什么您可能希望從主隊列中分派到主隊列中呢……好吧,盡管可以想象,您可能不會這樣做以安排一些工作在下次運行循環(huán)中進行。

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

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