当前位置:首页 > Windows程序 > 正文

GCD中一些API的使用

2021-03-29 Windows程序

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

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69860.html