我正在与GCD和块进行斗争。我正在尝试创建一系列需要前一个数据的方法。我正在考虑两种不同的方法来实现它。
您认为以下两个选项是否会返回相同的值?据我读到的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();
}
答案 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设计。