- Dispatch Group
在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现。如果只是使用一个Serial Dispatch Queue(串行队列)时,只要将想执行的处理全部追加到该串行队列中并在最后追加结束处理即可,但是在使用Concurrent Queue 时,可能会同时使用多个Dispatch Queue时,源代码就会变得很复杂。
在这种情况下,就可以使用Dispatch Group。
1234567891011121314151617181920212223dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create(
"com.gcd-group.www"
, DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
for
(
int
i = 0; i < 1000; i++) {
if
(i == 999) {
NSLog
(@
"11111111"
);
}
}
});
dispatch_group_async(group, queue, ^{
NSLog
(@
"22222222"
);
});
dispatch_group_async(group, queue, ^{
NSLog
(@
"33333333"
);
});
dispatch_group_notify(group, queue, ^{
NSLog
(@
"done"
);
});
控制台的输出:
因为向Concurrent Dispatch Queue 追加处理,多个线程并行执行,所以追加处理的执行顺序不定。执行顺序会发生变化,但是此执行结果的done一定是最后输出的。
无论向什么样的Dispatch Queue中追加处理,使用Dispatch Group都可以监视这些处理执行的结果。一旦检测到所有处理执行结束,就可以将结束的处理追加到Dispatch Queue中,这就是使用Dispatch Group的原因。
下面试一个使用Dispatch Group异步下载两张图片,然后合并成一张图片的medo(注意,我们总是应该在主线程中更新UI):
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#import "ViewController.h"
@interface
ViewController ()
@property
(
nonatomic
, strong) UIImage *imageOne;
@property
(
nonatomic
, strong) UIImage *imageTwo;
@property
(
nonatomic
, weak) UILabel *textLabel;
@end
@implementation
ViewController
- (
void
)viewDidLoad {
多线程知识巩固(七) 多线程安全读写
最新推荐文章于 2023-04-10 20:58:49 发布
本文详细介绍了在多线程环境中如何使用Dispatch Group进行安全读写,以及如何替代@synchronized提高代码效率。通过实例展示了如何使用dispatch_barrier_async保证数据一致性,同时解释了并行、串行、异步、同步的概念及其相互组合的效果,帮助理解GCD在多线程中的应用。
摘要由CSDN通过智能技术生成