美文网首页
多线程编程之GCD

多线程编程之GCD

作者: 阿咿呀嘿 | 来源:发表于2015-04-05 10:56 被阅读57次

GCD(Grand Central Dispatch)是基于C语言的底层API

使用BLOCK块定义任务作为队列中的操作

操作会被放入FIFO队列

队列负责调度BLOCK块的执行

一、三种队列类型

1、主队列main queue、全局调度队列global dispatch queue(包括四种优先级)、自定义队列

(1)系统主队列-串行执行

dispatch_queue_t queue =dispatch_get_main_queue();

(2)全局调度队列-高优先级、并行执行

dispatch_queue_t hightQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

(3)全局调度队列-默认优先级、并行执行

dispatch_queue_t defaultQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

(4)全局调度队列-低优先级、并行执行

dispatch_queue_t lowQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);

(5)全局调度队列-后台、并行执行

dispatch_queue_t backgroundQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);

(6)自定义队列-串行执行

dispatch_queue_t serialQueue =dispatch_queue_create("MySerialQueue",DISPATCH_QUEUE_SERIAL);

(7)自定义队列-并行执行

dispatch_queue_t concurrentQueue =dispatch_queue_create("MyConcurrentQueue",DISPATCH_QUEUE_CONCURRENT);

二、串行与并发

1、串行队列serial queue:队列中的BLOCK只能按照添加的顺序FIFO一个执行完再执行下一个

2、并发队列concurrent queue:队列中的BLOCK按照添加的顺序FIFO开始任务,开始后的BLOCK可以同时执行,可能以任意顺序完成BLOCK。

主队列为串行队列,全局调度队列为并发队列,自定义队列可以指定串行或并发。

并发与并行的区别:并发是宏观上同时进行,微观上非同时进行,比如单核CUP上时间片轮流执行;并行是宏观与微观上都同时进行,比如多核CPU上不同的核上同时执行。

三、同步与异步

1、同步Synchronous:同步函数在函数执行结束后才返回

dispatch_sync(backgroundQueue, ^{

NSLog(@"这个BLOCK先执行完成");

});

dispatch_sync(backgroundQueue, ^{

NSLog(@"这个BLOCK后执行完成");

});

2、异步Asynchronous:异步函数在开始执行后立即返回,而不等待函数执行完成

dispatch_async(backgroundQueue, ^{

NSLog(@"这个BLOCK先开始执行,执行完成的顺序不确定");

});

dispatch_async(backgroundQueue, ^{

NSLog(@"这个BLOCK后开始执行,执行完成的顺序不确定");

});

3、延迟Delay:在指定队列上延迟指定时间后开始执行BLOCK

double delayInSeconds =2.0;

dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);

dispatch_after(popTime,dispatch_get_main_queue(), ^{

NSLog(@"在主队列上延迟2秒后开始执行BLOCK");

});

4、一次性Once:指定标识的BLOCK只会被执行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

NSLog(@"不管这个标识为onceToken的BLOCK被提交多少次,只会执行一次");

});

四、分发组:实现多个BLOCK并发执行,全部执行完成后汇总结果

dispatch_group_t group =dispatch_group_create();

dispatch_group_async(group, defaultQueue, ^{

NSLog(@"BLOCK1先开始执行");

});

dispatch_group_async(group, defaultQueue, ^{

NSLog(@"BLOCK2后开始执行");

});

dispatch_group_notify(group, backgroundQueue, ^{

NSLog(@"BLOCK1和BLOCK2全部执行完毕后,才执行这里");

});

附:

苹果官方GCD队列示意图

相关文章

  • iOS多线程相关面试题

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

  • 多线程之--NSOperation

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

  • iOS多线程之--NSThread

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

  • GCD的使用

    GCD的详解iOS多线程--彻底学会多线程之『GCD』 GCD线程之间的通讯 一般在主线程里面刷新UI 点击、滚动...

  • iOS进阶之多线程管理(GCD、RunLoop、pthread、

    深入理解RunLoopiOS多线程--彻底学会多线程之『GCD』iOS多线程--彻底学会多线程之『pthread、...

  • iOS多线程之NSOperations

    相关文章:iOS多线程之NSThreadiOS多线程之GCD NSOperation(任务)与NSOperatio...

  • iOS多线程之GCD

    iOS多线程之GCD 什么是GCD GCD(grand central dispatch) 是 libdispat...

  • 多线程

    参考文章:iOS多线程--彻底学会多线程之『GCD』Swift 3.0 GCD和DispatchQueue 使用解...

  • FLAnimatedImageView加载卡顿问题。

    GCD 的调用 转载“iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用”

  • OC-多线程GCD

    参考:GCD源码深入理解 GCDiOS多线程--彻底学会多线程之『GCD』关于iOS多线程,我说,你听,没准你就懂...

网友评论

      本文标题:多线程编程之GCD

      本文链接:https://www.haomeiwen.com/subject/lojaxttx.html