IOS之GCD

GCD是Grand Central Dispatch的简称,它是基于语言的,用来解决多核并行运算。使用GCD,线程完全由系统进行管理,不需要再编写线程代码。

GCD的核心是:将长期运行的任务拆分成多个工作单元,并将这些单元添加到dispatch queue中,系统会为我们管理这些dispatch queue,为我们在多个线程上执行工作单元,我们不需要直接启动和管理后台线程。

dispatch queue严格遵循FIFO原则

serial dispatch queue执行串行任务

concurrent dispatch queue执行并发任务

系统会给每个应用提供三个并发dispatch queue,三个queue的区别是优先级。使用dispatch_get_global_queue函数来获取这三个queue:

//获取默认优先级的全局dispatch queue
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 第一个参数用于指定优先级,分别使用DISPATCH_QUEUE_PRIORITY_HIGH和DISPATCH_QUEUE_PRIORITY_LOW两个常量来获取高和低优先级的两个queue;第二个参数目前未使用到,默认0即可。

使用dispatch_queue_create来创建串行queue:

dispatch_queue_t queue = dispatch_queue_create("queue name", NULL);//第二个参数是queue属性

dispatch_get_current_queue获取当前queue

dispatch_get_main_queue获取主线程关联的串行queue

dispatch_get_global_queue获取全局共享的并发queue

异步添加任务:dispatch_async、dispatch_async_f

同步添加任务:dispatch_sync、dispatch_sync_f

并发迭代:dispatch_apply、dispatch_apply_f

可以使用dispatch_apply替代for循环

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
size_t count = 10;
dispatch_apply(count, queue, ^(size_t i) {
    printf("%zd", i);    
});

 dispatch_apply和dispatch_apply_t在迭代执行完后才返回,会阻塞当前线程,可以考虑在其他线程中异步执行。

dispatch group

使用dispatch_group_async函数将多个任务关联到一个Dispatch Group和相应的queue中,group会并发地同时执行这些任务。而且Dispatch Group可以用来阻塞一个线程, 直到group关联的所有的任务完成执行。

原文地址:https://www.cnblogs.com/sfce/p/4341694.html