iOS之GCD的局部解析

一什么是GCD :(Grand [伟大] Central [*]  Dispatch[调度])

  GCD又名“伟大的*调度器”,他是iOS4后才引进的一种多线程技术。开发者只需定义想执行的任务兵追加到Dispatch Queue(调度队列)中。GCD就能生成必要的线程并有计划的执行任务。GCD的实质其实就是队列。

二GCD的优势

  1.GCD的出现解决了多核并行运算的问题

  2.GCD自动管理线程的生命周期

  3.只需描写任务,无需编写任何线程管理的代码

注:由dispatch_queue_create方法生成的Dispatch Queue并不能由ARC来自动管理内存。可以使用dispatch_release、dispatch_retain来手动管理(引用计数式),但在目前看来,所用的OSX-10.8 开启的ARC已经不需要再用dispatch_release()来做管理

三GCD的遵循的规则

  GCD中任务的取出遵循队列的FIFO原则:先进先出,后进后出。

四GCD执行任务的方式

创建串行队列

dispatch_queue_t queue = dispatch_queue_create("first" , DISPATCH_QUEUE_SERIAL); DISPATCH_QUEUE_SERIAL被系统默认为NULL,他是串行队列的标示符

  1.串行队列同步执行:dispatch_sync(queue, ^{ NSLog(@"1"); }); 关键词sync表示同步

    串行队列同步执行:不会开辟线程,按顺序逐步执行(即会耗费内存,又无加快程序运行速度,基本上毫无意义)。

  2.串行队列异步执行:dispatch_async(queue, ^{ NSLog(@"1"); }); 关键词async表示异步

    串行队列异步执行: 会开辟线程,队列内的任务会逐步执行,线程内的任务与线程外的任务并发执行(很有用)。

创建并行队列

dispatch_queue_t queue = dispatch_queue_create("second" , DISPATCH_QUEUE_SERIAL); DISPATCH_QUEUE_SERIAL是并行队列的标志

  3.并行队列同步执行:dispatch_sync(queue, ^{ NSLog(@"1"); }); 关键词sync表示同步

    并行队列同步执行:不会开辟线程,按照顺序执行。(基本上没有用)。

  4.并行队列异步执行:dispatch_async(queue, ^{ NSLog(@"1"); }); 关键词async表示异步

    并行队列异步执行:  会开辟多个线程,线程的多少由GCD底层决定。对列的任务会同步执行(无法确定队列内任务的执行顺序,易出错)。

总结:同步执行的队列不会开辟线程,异步会开辟线程

四.GCD中的两个特殊队列

1.主队列:放到主队列中的任务,都会放到主线程中执行。
  使用dispatch_get_main_queue()获得主队列

  dispatch_queue_t queue = dispatch_get_main_queue();

  每一个应用程序只有一个主线程即只有一个主队列,主队列中的操作都是在主线程中执行的,不存在异步的概念。

注:主队列中添加的同步操作永远不会被执行(会死锁)

2.全局队列的生成

  ispatch_async(dispatch_get_global_queue(0, 0), ^{ })

  全局队列:全局队列是系统的,直接拿过来就可以用,与并行队列类似,但是不能指定队列的名字,调试时无法确认任务所在队列

  在全局队列中执行同步任务:不会新建线程,按顺序执行任务

  在全局队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序

3.全局并发队列的优先级:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台

DEMO:

见下一篇。

上一篇:JSON Web Token(JWT)机制


下一篇:删除Oracle用户及表空间