objective-c中的Dispatch_sync或完成块差异

时间:2014-12-27 07:53:29

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

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

  1. dispatch_sync serial queue
  2. 嵌套完成块
  3. 您认为以下两个选项是否会返回相同的值?据我读到的Apple dispatch queuesDISPATCH_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();
    }
    

2 个答案:

答案 0 :(得分:1)

您显示的两个代码示例都等同于:

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

换句话说,两种方式按顺序同步执行方法,并阻塞线程直到它们完成。

另外,正如Ken Thomases所说,你的方法都没有"返回"什么,所以关于回归的问题没有意义。

答案 1 :(得分:0)

在这里对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设计。