天天瞎忙活,QQ:705719110,欢迎来撩!

iOS中的多线程(四)

iOS开发 随风 213℃ 0评论

一、 GCD简介

GCD是 grand central dispatch 的英文缩写,意为强大的中央调度,GCD是系统底层的一种使用多线程的一种方式,执行效率更高。
首先来了解一些概念:
1.同步与异步 是相对于另外一个任务来说的。
同步
指的是当在执行第一个任务的时候,必须等第一个任务完全执行完之后,再开始第二个任务,不具备开启新线程的能力,这个很耗时间,所以尽量少用同步。

线程与进程4

异步
指的是当第一个任务一开始执行,不管是否执行完,就立刻开始第二个任务,具备开启新线程的能力。

线程与进程5

2.串行与并发 是相对于多个任务来说的。
串行
指多个任务按照一定的顺序,一个执行完之后 执行下一个。

线程与进程6

并发
指多个任务同时执行。

线程与进程7

二、GCD中常用的函数

1. 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
2. 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3. 使用dispatch_queue_create函数创建串行队列 dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 队列名称, 队列属性,一般用NULL即可

dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 创建
dispatch_release(queue); // 非ARC需要释放手动创建的队列

4. 使用dispatch_get_main_queue()获得主队列 dispatch_queue_t queue = dispatch_get_main_queue();

5. 使用dispatch_get_global_queue函数获得全局的并发队列 dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags); // 此参数暂时无用,用0即可

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列

全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台

6. //延时两秒
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后异步执行这里的代码…
});
//iOS中另一种常用的延时操作 [self performSelector:@selector(run) withObject:nil afterDelay:2.0];

7. //单例类的时候常用,这个是只执行一次的代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});

8. //创建一个队列组 dispatch_group_t group = dispatch_group_create();
首先:分别异步执行2个耗时的操作
其次:等2个异步操作都执行完毕后,再回到主线程执行操作
如果想要快速高效地实现上述需求,可以考虑用队列
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程…
});

三、示例代码

转载请注明:怼码人生 » iOS中的多线程(四)

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址