多线程GCD-牛逼中央调度器
多线程
GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建
使用dispatch_get_global_queue函数获得全局的并发队列
说明:全局并发队列的优先级
#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 // 后台
代码示例:
用异步函数往并发队列中添加任务
#import "LLBViewController.h" @interface LLBViewController () @end @implementation LLBViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 1,获取全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); // 2,添加任务到队列中,就可以执行任务 // 异步函数:具备开启新线程的能力 dispatch_async(queue, ^{ NSLog(@"下载电影1-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"下载电影2-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"下载电影3-----%@", [NSThread currentThread]); }); // 打印主线程 NSLog(@"主线程-----%@",[NSThread currentThread]); }
注意:同时开启3个线程
2>异步串行队列,有开启新的线程
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 创建串行队列 dispatch_queue_t queue = dispatch_queue_create("niubiGCD", NULL); // 第一个参数为串行队列的名称,是c语言字符串 // 第二个为队列的属性,一般说串行队列不用赋值任何属性,传null // 添加任务到队列中执行 dispatch_async(queue, ^{ NSLog(@"下载图片1-----%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"下载图片2-----%@", [NSThread currentThread]); }); // 非ARC需要释放队列 凡是new,alloc,retain,create都需要释放内存,因为创建对象的时候系统分配了内存 NSLog(@"主线程------%@", [NSThread currentThread]); }
2014-10-21 16:26:11.354 GCD[2347:907] 主线程------<NSThread: 0x7541aa0>{name = (null), num = 1} 2014-10-21 16:26:11.354 GCD[2347:1103] 下载图片1-----<NSThread: 0x757d2e0>{name = (null), num = 3} 2014-10-21 16:26:11.356 GCD[2347:1103] 下载图片2-----<NSThread: 0x757d2e0>{name = (null), num = 3}
注意:开启了新线程,但新的线程只有一个;
3>同步函数并行队列添加任务
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"主线程--------%@",[NSThread currentThread]); // 同步函数并发队列中添加任务 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 将任务添加到队列中 dispatch_sync(queue, ^{ NSLog(@"下载电影1-----%@", [NSThread currentThread]); }); // 将任务添加到队列中 dispatch_sync(queue, ^{ NSLog(@"下载电影2-----%@", [NSThread currentThread]); }); }
2014-10-21 16:34:55.725 GCD[2374:907] 主线程--------<NSThread: 0x762a0a0>{name = (null), num = 1} 2014-10-21 16:34:55.726 GCD[2374:907] 下载电影1-----<NSThread: 0x762a0a0>{name = (null), num = 1} 2014-10-21 16:34:55.726 GCD[2374:907] 下载电影2-----<NSThread: 0x762a0a0>{name = (null), num = 1}
注意:同步函数不具备开启新线程的能力,利用了当前线程
4>同步函数串行队列中添加任务
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"主线程--------%@",[NSThread currentThread]); // 同步函数串行队列中添加任务 dispatch_queue_t queue = dispatch_queue_create("niubiGDC", NULL); // 将任务添加到队列中 dispatch_sync(queue, ^{ NSLog(@"下载电影1-----%@", [NSThread currentThread]); }); // 将任务添加到队列中 dispatch_sync(queue, ^{ NSLog(@"下载电影2-----%@", [NSThread currentThread]); }); }
2014-10-21 16:38:36.116 GCD[2391:907] 主线程--------<NSThread: 0x763e4a0>{name = (null), num = 1} 2014-10-21 16:38:36.117 GCD[2391:907] 下载电影1-----<NSThread: 0x763e4a0>{name = (null), num = 1} 2014-10-21 16:38:36.118 GCD[2391:907] 下载电影2-----<NSThread: 0x763e4a0>{name = (null), num = 1}
注意:不会开启新的线程,还是当前主线程
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。