必备知识架构-线程与网络-①线程GCD

[toc]

知识架构

iOS知识库

Android知识库

六、GCD

< 返回目录

精: iOS开发多线程篇—GCD介绍

0、dispatch_sync、dispatch_async

1.GCD中有2个用来执行任务的函数

说明:把右边的参数(任务)提交给左边的参数(队列)进行执行

(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

以下参考自:dispatch_group_async 使用详解

1、dispatch_group_async (可实现队列同步)

要实现监听一组任务是否全部完成,等到全部完成后执行其他的操作可以使用dispatch_group_async(这个方法很有用)。比如异步下载多张图片,等所有图片下载完成之后,再去做一些事情(比如才通知界面说完成的)。

如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,我们只需把该操作放到最后一个任务来执行就可以,但是在并行队列中怎么做呢。答案是用dispatch_group任务组来做。

思路:创建一个任务组,然后将异步操作都放进任务组里面,在最后用notify 告知所有任务完成,并做相应处理,一般最后的处理都是在主线程里面刷新UI来提示用户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //创建并行队列queue
dispatch_group_t group = dispatch_group_create(); //创建任务组group

dispatch_group_async(group, queue, ^{
NSLog(@"group1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"group2");
});
dispatch_group_async(group, queue, ^{
NSLog(@"group3");
});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"updateUi");
});

dispatch_release(group);

附:下面的两种调用其实是等价的,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
A)

dispatch_group_async(group, queue, ^{

  // 。。。

});

B)

dispatch_group_enter(group);

dispatch_async(queue, ^{

  //。。。

  dispatch_group_leave(group);

});

其他:

使用gcd怎么让两个线程执行完结束后再去执行另一个线程

多线程并发流程控制之dispatch_group 有关函数

2、dispatch_barrier_async(可实现队列同步)

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dispatch_queue_t queue = dispatch_queue_create("**test.abc.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_async1");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"dispatch_async2");
});

dispatch_barrier_async(queue, ^{ //dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
NSLog(@"dispatch_barrier_async");
[NSThread sleepForTimeInterval:4];
});

dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async3");
});

3、dispatch_apply

dispatch_apply执行某个代码片段N次。

1
2
3
dispatch_apply(5, globalQ, ^(size_t index) {
// 执行5次
});

4、小结dispatch_group_async、dispatch_barrier_async、dispatch_apply分别是什么?

dispatch_group_async 可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了
dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
dispatch_apply 执行某个代码片段N次。

5、GCD四大队列

iOS GCD四大队列

(1)、串行队列
(2)、并发队列
(3)、全局队列

全局队列:
和并发队列,执行效果一样,只是说,并发队列,需要我们程序员,自己创建
而全局队列,是由于系统提供

(4)、主队列

END

< 返回目录