簡體   English   中英

Objective-C中的Dispatch_sync或完成塊差異

[英]Dispatch_sync or completion block difference in objective-c

我正在為GCD和塊而苦苦掙扎。 我正在嘗試創建一系列需要上一個數據的方法。 我正在考慮兩種不同的方法來實現它。

  1. dispatch_sync序列queue列
  2. 嵌套完成塊

您不認為以下兩個選項返回相同的值嗎? 據我在Apple的調度隊列中讀取的信息, DISPATCH_QUEUE_SERIAL以FIFO順序運行。 因此,兩個選項應返回相同的值。

我在這里做錯了什么? 最好的方法是哪一種? 謝謝你的幫助!

//Option 1

dispatch_queue_t delete_queue = dispatch_queue_create("delete_queue", DISPATCH_QUEUE_SERIAL);

dispatch_sync(delete_queue, ^{       
    [self dosomething];
});

dispatch_sync(delete_queue, ^{
    [self dosomething2];
});

dispatch_sync(delete_queue, ^{
    [self dosomething3]; 
});    

//Option 2

-(void)dosomething1:(dispatch_block_t)completion;
-(void)dosomething2:(dispatch_block_t)completion;
-(void)dosomething3:(dispatch_block_t)completion;

[self dosomething:^{ 
    [self dosomething2:^{
        [self dosomething3:^{}];
    }];
}];

-(void)dosomething:(dispatch_block_t)completion {

    /*method logic here*/
    completion();
}
-(void)dosomething2:(dispatch_block_t)completion {

   /*method logic here*/
   completion();
}
-(void)dosomething3:(dispatch_block_t)completion {

   /*method logic here*/
   completion();
}

您顯示的兩個代碼示例僅等效於:

[self dosomething];
[self dosomething2];
[self dosomething3]; 

換句話說,兩種方式都按順序同步執行方法,並阻塞線程直到完成。

而且,正如Ken Thomases所說,您的方法都不“返回”任何東西,因此您關於返回的問題沒有任何意義。

在這里對dispatch_sync()進行三個單獨的調用實際上沒有任何意義:

dispatch_sync(delete_queue, ^{       
    [self dosomething];
});

dispatch_sync(delete_queue, ^{
    [self dosomething2];
});

dispatch_sync(delete_queue, ^{
    [self dosomething3]; 
});    

相反,您應該將它們全部放在一個塊中:

dispatch_sync(delete_queue, ^{       
    [self dosomething];
    [self dosomething2];
    [self dosomething3]; 
});    

至於完成塊的使用,您當然可以獲得類似的結果,只是完成處理程序的結果需要異步。

我認為您需要退后一步,並說明要嘗試設計的API類型,以確定要如何使用系統工具和語言來實現該API設計。

暫無
暫無

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

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