iOS 多线程 GCD (二)

GCD 的一些其他方法

GCD 栅栏方法: dispatch_barrier_async

dispatch_barrier_async 起到的是一个栅栏的作用,它等待所有位 于dispatch_barrier_async 函数之前的操作执行完毕之后才执行,在dispatch_barrier_async 函数执行完毕之后,dispatch_barrier_async 之后的操作才会得到执行。dispatch_barrier_async 函数同 dispatch_queue_create 函数的并发队列配合使用。

GCD 延时执行方法: dispatch_after

dispatch_after 是用来延迟执行的GCD方法,这个函数并不是在指定时间后执行处理,而是在指定的时间将处理追加到 dispatch_queue。

1
2
3
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

});

GCD 只执行一次:dispatch_once

在创建单例或者有整个程序运行过程中只执行一次的代码时,就需要使用 GCD 的 dispatch_once 函数。dispatch_once 保证在程序运行过程中,代码只被执行一次,即使是在多线程的环境下,也可以保证线程安全。

1
2
3
4
5
6
-(void)once{
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
//只执行一次的代码
});
}

单例的创建:

1
2
3
4
5
6
7
8
9
+(instancetype)sharedInstance{
static id sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
sharedInstance = [[self alloc] init];
});

return sharedInstance;
}

GCD 快速迭代:dispatch_apply

dispatch_apply 函数按照指定的次数将指定的 block 追加到指定的 dispatch_queue 中,并且等待全部的处理执行结束。

1
2
3
4
5
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_apply(10, queue, ^(size_t index){
NSLog(@"%zu", index);
});
NSLog(@"Done");

由于是在 Global Dispatch Queue 中执行,所以各个处理的执行时间不定,但是 done 一定会在最后的位置输出,因为 dispatch_apply 函数会等待所有的处理结束。