初步多线程(GCD)_1

1. 常用方法: (1)block定义: --block语法
a) 声明:
初步多线程(GCD)_1
文章图片
b) 定义:
初步多线程(GCD)_1
文章图片
c) 调用:
初步多线程(GCD)_1
文章图片
(2) GCD (系统方法相关)
a) 基础:

i.后台执行
初步多线程(GCD)_1
文章图片
ii.主线程执行
初步多线程(GCD)_1
文章图片
iii.一次性执行 --- dispatch_once_t必须是全局或static变量
初步多线程(GCD)_1
文章图片
iv.延迟2秒执行
dispatch_after是延迟提交,不是延迟运行,所以想用dispatch_after精确控制运行状态的朋友可要注意了~
初步多线程(GCD)_1
文章图片
b) 自定义queue: --- 创建串/并行队列 --- 注意第二个参数
初步多线程(GCD)_1
文章图片
c) dispatch_group --- 使用dispatch_group_async函数将多个任务关联到一个dispatch Group和相应的queue中,group会并发地同时执行这些任务。(会阻塞线程)
i. 自己创建队列:
初步多线程(GCD)_1
文章图片
dispatch_group_notify函数用来指定一个额外的block,该block将在group中所有任务完成后执行。


ii. 无法直接使用队列变量 --- 使用AFNetworking添加异步任务
初步多线程(GCD)_1
文章图片
使用dispatch_group_enter,dispatch_group_leave就可以方便的将一系列网络请求“打包”起来~


d) dispatch_suspend && dispatch_resume --- 提供了 “挂起、恢复” 队列的功能。

dispatch_suspend !=立即停止队列的运行,不能保证可以立即停止队列上正在运行的block。
初步多线程(GCD)_1
文章图片


e) dispatch_apply --- 在一个队列(串行或并行)上“运行”多次block
初步多线程(GCD)_1
文章图片
dispatch_apply确实会“等待”其所有的循环运行完毕才往下执行,会将主线程阻塞。


GCD 通过用dispatch barriers创建一个读者写者锁提供了一个优雅的解决方案。

f) dispatch_barrier_async && dispatch_barrier_sync
向某个队列插入一个block,当目前正在执行的block运行完成后,阻塞这个block后面添加的block,只运行这个block直到完成,然后再继续后续的任务。
初步多线程(GCD)_1
文章图片
dispatchbarrier(a)sync只在自己创建的并发队列上有效,在全局(Global)并发队列、串行队列上,效果跟dispatch_(a)sync效果一样。


h) dispatch_set_context与dispatch_set_finalizer_f的配合使用 --- 为队列添加上下文数据。
因为GCD是C语言接口形式,所以要用malloc/new/OC对象(__bridge关键字)创建。
同时,要用free/delete/CFRelease释放内存。
初步多线程(GCD)_1
文章图片

2. 引文:

(1)Grand Central Dispatch 基础教程:Part 1 --- 连续&并发,同步&异步,并发&并行,队列等基础知识,特别适合入门和对知识体系的梳理。
(2)iOS开发进阶/唐巧 --- GCD的便利性 和 GCD方法的简单使用。
(3)多线程编程 - GCD --- 细节介绍的很到位,实例也很贴切。
(4)GCD使用经验与技巧浅谈 --- GCD使用中的注意事项 和 一些 “坑”。


==================================================
GCD 扫盲篇

【初步多线程(GCD)_1】Parse源码浅析系列(一)---Parse的底层多线程处理思路:GCD高级用法

    推荐阅读