GCD中一些API的使用
1.串行队列和并行队列
iOS中线程分为串行队列和并行队列,串行队列指的是任务按照先后顺序,依次执行;并行队列指的是任务不按照加入的先后顺序,并发的执行。
iOS中串行队列通过如下方式进行创建
dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_SERIAL);
需要注意的是,引号中的内容表示的是对该队列的描述,后面的参数代表的是串行队列。
并行队列通过如下方式进行创建
dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_CONCURRENT);
或者
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一种方式中,第一个参数表示对该队列的描述,后一个参数表示这是一个并行队列.
第二种方式中,这个队列创建的是一个全局类型的并行队列,第一个参数表示当前队列的优先级,第二个参数含义未知。
需要注意的是,GCD是C语言系的东西,所以不遵循ARC机制。当创建队列用到
dispatch_queue_create
这个方法的时候,需要在该队列在不用时,进行释放
dispatch_release
2.变更队列的优先级
队列创建后的优先级是可以更改的,使用到的方法
dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue);
这里面是将第一个队列改成第二个队列的优先级
3.dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
这个方法是将任务n秒后加入队列,不是任务加入队列后n秒后执行,所以这里需要注意的是,如果前面的任务阻塞了,那么这里的时间可能就不准确了。
4.dispatch_group
这个方法是将多个队列的任务都执行完之后才进行下面的操作,执行代码如下
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
});
dispatch_group_async(group, queue, ^{
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
});
5.dispatch_barrier_async
在对文件读写过程中,读和写操作只能单一进行,读操作可以分开同时执行。
在GCD中可以通过此方法,在并行队列中快速对文件进行读写操作,该方法进行的操作是,只有此方法的事件处理完成之后,才进行后面的操作,这样就可以将读写操作分开
dispatch_async(queue, ^{
//读
});
dispatch_async(queue, ^{
//读
});
dispatch_async(queue, ^{
//读
});
dispatch_barrier_async(queue, ^{
//写
});
dispatch_async(queue, ^{
//读
});
dispatch_async(queue, ^{
//读
});
6.dispatch_sync
既然函数名包含了async(异步的意思),那么就应该有sync的函数。
异步队列方法是指不用等待函数的返回结果,就可以执行下去;
同步队列方法是指需要等待函数的返回结果,也就是必须要等到函数处理完才能继续执行。
那么在使用的过程中稍有不慎,就有可能会出现死锁的情况,比如如下情况
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"123");
});
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"123");
});
});
7.dispatch_apply
GCD中提供了循环方法,可以通过此方法进行快速遍历,
dispatch_apply(10, queue, ^(size_t index) {
});
需要注意的是,这个方法的执行不像for循环那样按照顺序来的,他的顺序是随机的。
8.线程的挂起和继续
NSLog(@"线程暂停");
dispatch_suspend(queue);
NSLog(@"线程继续");
dispatch_resume(queue);
需要注意的是不要在主现场执行此操作,避免阻塞主线程。
9.dispatch_once
在apple的文档中,推荐的单例创建方法是使用此方法进行创建。该方法保证了在程序运行中只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
///需要执行的操作
});
10.GCD中的大文件读写
dispatch_io_create
版权声明:本文为博主原创文章,未经博主允许不得转载。