ios多线程操作(四)—— GCD核心概念
2017-05-04 18:59
239 查看
GCD全称Grand Central Dispatch。可译为“大派发中枢调度器”,以纯C语言写成,提供了很多很强大的函数。GCD是苹果公司为多核的并行运算提出的解决方式,它能够自己主动利用很多其它的CPU内核来參与运算。会自己主动管理线程的生命周(创建线程、调度任务、销毁线程)。而程序猿仅仅须要告诉GCD想要运行什么任务,不须要编写不论什么线程管理代码!
GCD中有两个核心概念,一是任务。二是队列。
任务:要运行什么样的操作。任务都是预先以Block封装好准备要运行的一段代码。
队列:用来存放任务,依照先进先出的方式,调度任务在哪一条线程上运行。
GCD中有两个用来运行任务的函数,各自是同步函数和异步函数。
同步函数:该函数的代码形式例如以下
dispatch_sync(dispatch_queue_t queue, ^(void)block)
当中queue为队列,block为任务
同步任务并不会创建线程,但会在当前线程(能够是子线程,页能够是主线程)中运行。同步任务有一个特性。仅仅要同步任务一加入到队列中就要立即运行。同步任务不运行完就不会运行往后的代码。
比如:
执行结果例如以下:
据此能够验证同步任务的特性
异步函数:
dispatch_async(dispatch_queue_t queue, ^(void)block)
普通情况下异步任务都会开启一条子线程在后台运行(有一种情况除外。后面会讲到),异步任务的一个特性就是不用等待当前线程的任务就能直接运行
比如:
执行结果例如以下:
第二次执行结果:
能够看到两次执行结果不同,且不在同一线程中.
假设将代码改为例如以下形式:
运行结果例如以下:
由此可得队列开启多少条我们无法控制。异步函数并不会等待当前线程(当前线程为主线程)的任务。
GCD中有两个核心概念,一是任务。二是队列。
任务:要运行什么样的操作。任务都是预先以Block封装好准备要运行的一段代码。
队列:用来存放任务,依照先进先出的方式,调度任务在哪一条线程上运行。
GCD中有两个用来运行任务的函数,各自是同步函数和异步函数。
同步函数:该函数的代码形式例如以下
dispatch_sync(dispatch_queue_t queue, ^(void)block)
当中queue为队列,block为任务
同步任务并不会创建线程,但会在当前线程(能够是子线程,页能够是主线程)中运行。同步任务有一个特性。仅仅要同步任务一加入到队列中就要立即运行。同步任务不运行完就不会运行往后的代码。
比如:
- (void)viewDidLoad { [super viewDidLoad]; // 获得全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, 0); // 运行同步任务 dispatch_sync(q, ^{ // 让运行该任务的线程休眠2s [NSThread sleepForTimeInterval:2.0]; NSLog(@"block - %@",[NSThread currentThread]); }); NSLog(@"viewDidLoad - %@",[NSThread currentThread]); }
执行结果例如以下:
据此能够验证同步任务的特性
异步函数:
dispatch_async(dispatch_queue_t queue, ^(void)block)
普通情况下异步任务都会开启一条子线程在后台运行(有一种情况除外。后面会讲到),异步任务的一个特性就是不用等待当前线程的任务就能直接运行
比如:
- (void)viewDidLoad { [super viewDidLoad]; // 获得全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, 0); // 运行异步任务 dispatch_async(q, ^{ // for (int i = 0; i<10; i++) { NSLog(@"block - %@ - %d",[NSThread currentThread],i); } }); NSLog(@"viewDidLoad - %@",[NSThread currentThread]); }
执行结果例如以下:
第二次执行结果:
能够看到两次执行结果不同,且不在同一线程中.
假设将代码改为例如以下形式:
- (void)viewDidLoad { [superviewDidLoad]; //获得全局队列 dispatch_queue_t q =dispatch_get_global_queue(0, 0); //运行异步任务 for (int i = 0; i< 10; i++) { dispatch_async(q, ^{ NSLog(@"block - %@ - %d",[NSThreadcurrentThread],i); }); } NSLog(@"viewDidLoad - %@",[NSThreadcurrentThread]); }
运行结果例如以下:
由此可得队列开启多少条我们无法控制。异步函数并不会等待当前线程(当前线程为主线程)的任务。
相关文章推荐
- ios多线程操作(四)—— GCD核心概念
- ios多线程操作(四)—— GCD核心概念
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- ios多线程操作(六)—— GCD全局队列与主队列
- ios多线程操作(五)—— GCD串行队列与并发队列
- iOS 开发 多线程详解之GCD基本概念
- iOS之多线程——概念、pthread、NSThread、GCD
- ios多线程操作(八)—— GCD调度组
- ios多线程操作(九)—— 用NSOperation代替GCD
- iOS多线程操作(NSThread,GCD,NSNSOperation )
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- IOS 多线程之GCD的详细操作
- ios多线程操作(八)—— GCD调度组
- iOS 开发 多线程详解之GCD应用延迟操作,单例设计模式,调度组
- 刀哥多线程GCD核心概念gcd
- ios多线程操作(七)—— GCD延迟操作与一次性代码
- IOS多线程 总结 -------------核心代码(GCD)
- ios多线程操作(五)—— GCD串行队列与并发队列
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- iOS学习笔记74-IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别附代码