ios - Objective-C 中的 Dispatch_sync 或完成 block 差异

标签 ios objective-c-blocks grand-central-dispatch

我正在与 GCD 和 block 作斗争。我正在尝试创建一系列需要前一个数据的方法。我正在考虑两种不同的方法来实现它。

  1. dispatch_sync 串行队列
  2. 嵌套完成 block

您不认为以下 2 个选项返回相同的值吗?据我在 Apple 的 dispatch queues 中所读, 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 所说,您的方法都没有“返回”任何东西,因此您关于返回的问题没有意义。

关于ios - Objective-C 中的 Dispatch_sync 或完成 block 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665443/

相关文章:

ios - 为什么 View 即使在我的线程上也没有更新?

ios - dispatch_async永远不会完成整个 block 的执行

ios - 如何在 Swift 中检查标志的位域(特别是 SCNetworkReachabilityFlags)?

iOS:自定义相机如何始终以正确的方向保存图像?

iOS >> 动画 block >> 更改 block 执行的 Moving ImageView 方向 'In the Middle'

ios - 如何在异步线程中更新 ProgressView

ios - NSOperation 没有在后台线程中发生

ios - 如何在 MAC 机器中从命令提示符启动 Appium 服务器?

ios - 如何将 View 限制在 tableView 分隔符的边缘?

iOS - GCD 和 __strong 引用