亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

iPhone-大中央調度主線程

iPhone-大中央調度主線程

iOS
慕蓋茨4494581 2019-11-22 14:37:20
我一直在應用程序中成功使用大型中央調度程序,但是我想知道使用這樣的東西的真正優勢是什么:dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff甚至dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff我的意思是,在兩種情況下,您都將觸發要在主線程上執行的塊,確切地說是應用程序的運行位置,這無助于減少負載。在第一種情況下,您無法控制該塊何時運行。我已經看到了在您觸發它們后半秒鐘執行塊的情況。第二種情況,類似于[self doStuff];對?我想知道你們的想法。
查看完整描述

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

在后臺隊列上處理的數據塊->信號主隊列以開始下一個塊

后臺隊列上的傳入網絡數據->通知主隊列消息已到達

至于為什么您可能希望從主隊列中分派到主隊列中呢……好吧,盡管可以想象,您可能不會這樣做以安排一些工作在下次運行循環中進行。


查看完整回答
反對 回復 2019-11-22
?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

從主線程調度塊到主隊列可以是有用的。它使主隊列有機會處理已排隊的其他塊,這樣您就不會簡單地阻止其他所有對象的執行。

例如,您可以編寫一個本質上是單線程的服務器,該服務器仍然可以處理許多并發連接。只要隊列中沒有任何單個塊花費太長時間,服務器就會保持對新請求的響應。

如果您的程序只花一生時間來響應事件,那么什么都不做,那么這很自然。您只需將事件處理程序設置為在主隊列上運行,然后調用dispatch_main(),就根本不必擔心線程安全。


查看完整回答
反對 回復 2019-11-22
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

希望我能正確理解您的問題,因為您想知道dispatch_async和dispatch_sync之間的區別?


dispatch_async

將異步地將塊分配到隊列。這意味著它將繼續將塊發送到隊列,而無需等待其返回,然后繼續執行方法中剩余的代碼。


dispatch_sync

將同步將塊分配到隊列。這將防止在該塊執行完之前再執行該方法中剩余的代碼。


我大部分dispatch_async時間都在后臺隊列中使用a 來擺脫主隊列的工作,并利用設備可能具有的任何額外核心。然后dispatch_async,如果需要更新UI,請轉到主線程。


查看完整回答
反對 回復 2019-11-22
  • 3 回答
  • 0 關注
  • 488 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號