GCD的使用

1.dispatch_async和dispatch_sync的区别

(来自http://www.cnblogs.com/zhidao-chen/p/3598215.html 的总结)

首先,同、异步操作只是在当前线程中,操作的是否按照顺序执行的问题,与线程无必然联系。

主线程中可以有同步,异步操作,子线程里也可以有同步和异步的操作。

只是如果执行异步操作了,说明在当前线程中(可能当前是主线程或一个子线程),必然启动了一个子线程来执行任务,异步操作也叫做“把一个操作放进了一个非主队列的队列中执行”。

dispatch_sync(),同步添加操作(进队列中)。他是等待添加进队列里面的操作完成之后再继续执行。

dispatch_async ,异步添加进任务队列,它不会做任何等待。

dispatch_async(queue,block) async 异步队列,dispatch_async函数会立即返回, block会在后台异步执行。

dispatch_sync(queue,block) sync 同步队列,dispatch_sync函数不会立即返回,即阻塞当前线程,等待 block同步执行完成。

总结:

首先区分异步和同步操作:

dispatch_sync(),同步添加操作。它是等待添加进()里面的操作完成之后再继续执行。

dispatch_async ,异步添加进任务队列,它不会做任何等待,跳过执行之后的代码去。

然后是区分串行队列和并行队列:

串行队列:添加进队列的任务顺序执行

并行队列:添加进队列的任务并行执行,顺序不一定

另外,主队列是特殊的串行队列,全局队列dispatch_get_global_queue是系统自带并发队列,可以直接使用。队列能代表着线程,主队列执行任务就是在主线程里执行任务,非主队列执行任务就是在子队列执行任务。

但注意,只有将dispatch_async(代表异步)搭配非主队列(代表并发)执行任务,才叫做多线程操作。多线程肯定应该是异步并发执行。

注意:异步、队列、线程的关系:http://www.jianshu.com/p/8e81d8caee34

队列中可以添加多个线程,多个线程可以在这串行(hang)队列里一次执行一个线程;或者在并发队列里,一次执行多个线程。

!!!! 通过dispatch_async 使用异步,来将任务添加到队列中,会创建线程来执行任务,从而实现了异步操作,多线程操作。

并行队列 就是多条线程一起 执行任务

1.dispatch_sync:同步添加任务到队列,不会创建新的线程,都是在当前线程中处理的。无论添加到串行队列里或者并行队列里,都是串行效果,因为这个方法是等任务执行完成以后才会返回。

2.dispatch_async:异步添加任务到

2-1:mainQueue不创建线程,在主线程中串行执行

2-2:globalQueue 和 并行队列:根据任务系统决定开辟线程个数

2-3:串行对列:创建一个线程:串行执行。

异步是用来加入到队列中,这样会开辟线程来执行操作。

且无论多少个异步加入到串行队列,都只会开一个线程;有多少个异步加入到并行队列,就会开辟多少个线程。

所以启动多线程里执行的是一个blcok语句块,这样就是在异步执行block里的内容,写法很方便简洁。

2.关于全局队列和并发队列

dispatch_queue_create(nil,DISPATCH_QUEUE_CONCURRENT);是创建了一个并发队列,属于自定义的用户队列

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);也是一个并发队列,属于一个全局的并发队列;

3.GCD Queue 分为三种:

http://www.jianshu.com/p/46500f070e9c

1,The main queue :主队列(主线程的串行队列),主线程就是在个队列中。

2,Global queues : 全局(并发)队列。

3,用户(自定义)队列:是用函数dispatch_queue_create创建的自定义队列。可以创建 并发队列和串行队列。

注意:

并发队列,用于实现队列们之间同时并发地执行。如果你的需求需要某个并发线程先执行,可以通过设置优先级来达到目的,但是因为线程是并发执行的,所以你不能保证哪个线程会先执行完,也就是不能保证我们的耗时任务是按照顺序执行的。

串行队列,用于实现队列间顺序执行。

4.GCDDelay:延迟执行:  需求延迟3秒后,执行某项操作

与NSThread的延迟执行比较:NSThread冗长,但精确度高,且能取消延迟执行操作;GCDDelay代码精简,但有毫秒级误差,没有取消操作。

dispatch_queue_tconcurrentQueue =dispatch_queue_create("my.concurrent.queue",DISPATCH_QUEUE_CONCURRENT);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW,NSEC_PER_SEC*2.f), concurrentQueue, ^{

NSLog(@"GCD延迟2秒执行");

});

5.GCDGroup:能够监听 加入到组中的线程的执行情况。从而可以实现一些特殊需要,如既希望多线程间并发执行,又希望其中一个线程在其他线程完成后执行。

使用:

1、创建线程组:dispatch_group_tgroup =dispatch_group_create();

2、创建一个线程队列dispatch_queue_tqueue =dispatch_queue_create("my.concurrent.queue",DISPATCH_QUEUE_CONCURRENT);

3、让队列中的每一个线程,都在group中运行

dispatch_group_async(group, queue, ^{

NSLog(@"1");

});

4、notify监听线程组中 之前的线程是否执行完成,并执行block

dispatch_group_notify(group, queue, ^{

NSLog(@"3");

});

6.GCDTimer:GCD定时器,让一个操作在GCD定时器开启后,在某线程内,每个NSEC_PER_SEC时间执行一次。

//获得队列

dispatch_queue_tqueue =dispatch_get_main_queue();

//创建一个定时器(dispatch_source_t本质还是个OC对象)

dispatch_source_ttimer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0, queue);

//设置定时器的各种属性(几时开始任务,每隔多长时间执行一次)

// GCD的时间参数,一般是纳秒NSEC_PER_SEC(1秒== 10的9次方纳秒)

//何时开始执行第一个任务

// dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC)比当前时间晚3秒

dispatch_time_tstart =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0*NSEC_PER_SEC));

uint64_tinterval = (uint64_t)(1.0*NSEC_PER_SEC);

dispatch_source_set_timer(timer, start, interval,0);

//设置回调

dispatch_source_set_event_handler(timer, ^{

NSLog(@"GCD定时器");

});

//启动定时器

dispatch_resume(timer);

7.GCDSemaphore:信号量,能实现让两个异步线程,同步执行。

使用方法:先创建GCDSemaphore,然后在需要先执行的线程中 让发出信号,再在需要后执行的线程中 让信号等待。

//信号量的使用就这3句

// 1.创建信号量

dispatch_semaphore_tdispatchSemaphore =dispatch_semaphore_create(0);

dispatch_queue_tgQueue =dispatch_get_global_queue(0,0);

dispatch_async(gQueue, ^{

NSLog(@"1");

//        2.发送信号量

dispatch_semaphore_signal(dispatchSemaphore);//线程1执行完进行发送信号

});

dispatch_async(gQueue, ^{

//        3.等待信号(发送与等待信号量是配对使用的)

//原理:线程1,2会同时并发的执行,到线程2执行到这里,遇到dispatch_semaphore_wait,会停下来看看是否信号量已发送,发送了才往下执行

dispatch_semaphore_wait(dispatchSemaphore,DISPATCH_TIME_FOREVER);//线程2的内容执行前等待信号

NSLog(@"2");

});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容