IOS学习之对GCD的认识
2018-05-28 本文已影响0人
最强的小强
Grand Central Dispatch
,它是苹果为多核的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核,最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),所以我们只需要告诉他干什么就行。同时它使用的也是 c语言,不过由于使用了 Block,使用起来更加方便,而且灵活。
任务和队列
- 任务:即操作,就是一段代码,在 GCD 中就是一个 Block,所以添加任务十分方便。任务有两种执行方式: 同步执行 和 异步执行,他们之间的区别是
会不会阻塞当前线程,直到 Block 中的任务执行完毕!
。
同步执行:它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。
异步执行:当前线程会直接往下执行,它不会阻塞当前线程。
- 队列:用于存放任务。一共有两种队列, 串行队列 和 并行队列。
GCD 会 FIFO(先进先出)原则执行任务:
同步执行 | 异步执行 | |
---|---|---|
串行队列 | 当前线程,一个一个执行 | 其他线程,一个一个执行 |
并行队列 | 当前线程,一个一个执行 | 开很多线程, 一起执行 |
创建任务
- 同步任务:会阻塞当前线程 。
dispatch_sync(<#queue#>, ^{
//code here
NSLog(@"%@", [NSThread currentThread]);
});
- 异步任务:不会阻塞当前线程 。
dispatch_async(<#queue#>, ^{
//code here
NSLog(@"%@", [NSThread currentThread]);
});
创建队列
- 主队列:这是一个特殊的 串行队列。它用于刷新 UI,任何需要刷新 UI 的工作都要在主队列执行,所以一般耗时的任务都要放到别的线程执行。
// 主队列
dispatch_queue_t queue= ispatch_get_main_queue();
-
自己创建的队列:自己可以创建 串行队列, 也可以创建 并行队列。 其中,
第一个参数是标识符,用于 DEBUG 的时候标识唯一的队列,可以为空。
第二个参数用来表示创建的队列是串行的还是并行的,传入DISPATCH_QUEUE_SERIAL
或NULL
表示创建串行队列。传入DISPATCH_QUEUE_CONCURRENT
表示创建并行队列。
// 串行队列
dispatch_queue_t queue1 = dispatch_queue_create("tk.bourne.testQueue", NULL);
dispatch_queue_t queue2 = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_SERIAL);
// 并行队列
dispatch_queue_t queue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_CONCURRENT);
- 全局并行队列:只要是并行任务一般都加入到这个队列。这是系统提供的一个并发队列。
// 全局并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);