Objetive-C学习_GCD学习笔记_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Objetive-C学习_GCD学习笔记

Objetive-C学习_GCD学习笔记

 2015/4/21 21:29:44  唐福  程序员俱乐部  我要评论(0)
  • 摘要:GCD:苹果为多核的并行运算提出的解决方法GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)队列:用来存放任务(串行队列、并行队列)任务:执行什么操作(同步、异步)并发:多个任务同时执行串行:一个任务执行完毕后,再执行下一个任务全局并发队列(多条)手动创建串行队列(1条)主队列(0条)同步(sync)需要0条没有开启新线程串行执行任务没有开启新线程串行执行任务没有开启新线程串行执行任务异步(async
  • 标签:笔记 学习 学习笔记

GCD : 苹果为多核的并行运算提出的解决方法

GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

队列 : 用来存放任务(串行队列、并行队列)

任务 : 执行什么操作(同步异步

并发 : 多个任务同时执行

串行 : 一个任务执行完毕后,再执行下一个任务

 

 

全局并发队列(多条)

手动创建串行队列(1条)

主队列(0条)

同步(sync)

需要0条

没有开启新线程

串行执行任务

没有开启新线程

串行执行任务

没有开启新线程

串行执行任务

异步(async)

需要多条

开启新线程

并发执行任务

开启新线程

串行执行任务

没有开启新线程

串行执行任务

 

我的记忆方法(仅仅是记忆方法): 把队列看成具有新开线程的能力,但是他们能力有限不能无限开,把任务看成需要线程的数量。根据需求和队列能力得到最后的先开线程的数量(数量如表格)。

 

对应方法 :

同步方式执行任务 : dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

异步方式执行任务 : dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

获取全局并发队列 : dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

创建串行队列 : dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 队列名称、队列属性(一般用NULL即可)

获得主队列 : dispatch_get_main_queue();

 

延时函数 :

(1) [self  performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)];//对象方法,只能在当前的线程还要写一个方法

(2) dispatch_after(dispatch_time(dispatch_time_t when, int64_t delta), dispatch_queue_t queue, ^(void)block)

参数说明 :

//when可以设置为0也可以用DISPATCH_TIME_NOW,表示从现在开始

//delta 一般传入 (int64_t)(X * NSEC_PER_SEC)   其中X表示多少秒后

//NSEC_PER_SEC打印出来是1000000000

// dispatch_time_t其实是unsigned long long

// int64_t 其实是 long long

单例模式

  +(id)ShareManager

{

    static MyManager * staticInstance = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        staticInstance = [[self alloc]init];

    });

    return staticInstance;

}

 

队列组使用步骤: (多个耗时操作都完成之后执行操作)

1.创建队列组 :dispatch_group_t group = dispatch_group_create();

2.创建组任务添加到组中 :dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);

3.等队列组里面的任务都执行完毕再执行其他操作 :     dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);

注意点和知识点 :

(1 )如果使用的是非ARC,创建队列也要释放,凡是函数名中带有create/copy/new/retain,都需要在不需要使用这个数据的时候进行release。但是CF(core Foudation)的数据类型在ARC环境下还是要release

(2)同步函数不能放在主线程中,在主线程往主队列中添加任务(会卡住)。因为串行队列是执行一个任务完才会执行下一个

  (3)GCD已经提供了全局的并发队列,供整个应用使用,不需要手动创建;串行队列要自己创建。

   (4) 任务的取出队列FIFO原则 : 先进先出,后进后出

发表评论
用户名: 匿名