GCD中一些API的使用
来源:互联网 发布:java 自定义日志注解 编辑:程序博客网 时间:2024/06/06 05:51
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
这个方法的时候,需要在该队列在不用时,进行释放(通过下面评论提示,这个queue的释放在iOS6之后已经可以交给ARC来处理了,多谢提醒)
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
- GCD中一些API的使用
- GCD的一些简单使用
- VB中一些API的使用
- 一些API的使用
- GCD API使用
- GCD中一些比较有趣的点
- iOS 中 GCD 的一些“常识”
- GCD,线程使用的一些笔记
- iOS中GCD的使用
- 腾讯云API接口使用中碰到的一些问题
- GCD的API
- 使用mysql++ 的一些api
- GCD的一些东西
- GCD的一些用法
- GCD的一些原理
- GCD的一些功能
- gcd的一些性质
- GCD的一些知识
- 数据挖掘学习整理(十)分类算法
- 黑马程序员-oc基础-NSString和NSMutableString区别
- SED命令详解
- C++ 模板详解(二)
- redis应用
- GCD中一些API的使用
- 3D数学 坐标系
- 外网访问自己的tomcat
- C++学习篇— 字符串操作
- 成人拉丁---怎样学习成人拉丁舞,这与年事无关!只要你喜好!
- iOS8使用TestFlight进行内部测试功能尝鲜
- JavaScript——Day1
- ffmpeg将视频每帧画面保存为PPM格式图片,使用最新的ffmpeg官网15-7-2日更新的版本
- 调试过程中出现以下问题.\layout\activity_main.out.xml:1: error: Error parsing XML: no element found