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关联的所有的任务完成执行。