您的位置:首页 > 移动开发 > IOS开发

iOS--多线程之GCD(Grand Central Dispatch)

2017-03-27 00:00 393 查看
做一下整理,与大家分享,不足之处请留言:

GCD中最核心的是任务和队列,使用时要先创建任务,然后将任务添加到队列中。

创建任务时有两种方式:

同步:只能在当前线程中执行任务,不具备开启新线程的能力

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

异步:可以在新的线程中执行任务,具备开启新线程的能力

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

队列有两类:

并发队列(Concurrent Dispatch Queue)

可以让多个任务同时执行(自动开启多个线程同时执行任务)

并发功能只有在异步(dispatch_async)函数下才有效

串行队列(Serial Dispatch Queue)

让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

创建队列

创建并发队列

dispatch_queue_t queue = dispatch_queue_create("作用.queue", DISPATCH_QUEUE_CONCURRENT);

获取全局的并发队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

创建串行队列

dispatch_queue_t queue = dispatch_queue_create("作用.queue", DISPATCH_QUEUE_SERIAL);

获取主队列:主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行

dispatch_queue_t queue = dispatch_get_main_queue();

从网上找的图,可以借鉴:



注:在使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列

线程之间的通信:获得全局的并发队列,并创建一个异步任务(开启一个新的子线程)执行耗时操作,完成 之后回到主线程,创建UI刷新界面

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

// 执行耗时的异步操作...

dispatch_async(dispatch_get_main_queue(), ^{

// 回到主线程,执行UI刷新操作

}); });

dispatch_once: 在程序运行过程中只被执行1次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

// 只执行1次的代码(这里面默认是线程安全的)

});

延时执行 1. [self performSelector:@selector(downLoad) withObject:nil afterDelay:3.0];

2. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

// 3秒后异步执行这里的代码... });

队列组 异步执行多个耗时的操作,都执行完毕后,再回到主线程执行操作

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 GCD