iOS开发专区iOS Developer程序员

多线程编程之GCD

2017-06-29  本文已影响49人  大猿媛

GCD是什么:一句话负责线程池的中央调度

GCD全称为Grand Central Dispatch,是libdispatch的市场名称,而libdispatch是Apple的一个库,其为并发代码在iOS和OS X的多核硬件上执行提供支持。确切地说GCD是一套低层级的C API,通过 GCD,开发者只需要向队列中添加一段代码块(block或C函数指针),而不需要直接和线程打交道。GCD在后端管理着一个线程池,它不仅决定着你的代码块将在哪个线程被执行,还根据可用的系统资源对这些线程进行管理。这样通过GCD来管理线程,从而解决线程被创建的问题。

GCD的优势

相关概念

GCD中涉及到队列、线程、串行并行、同步异步、串行并发等概念,这些概念的认知可以通过我的另一篇文章

具体使用

队列

对了除了串行和并行之分,全局队列还有一些相关属性影响着队列内任务的执行,比如优先级等,高优先级的队列,在等候被调度的情况下更容易获取资源或机会

    //主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
     //自定义的串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue0", DISPATCH_QUEUE_SERIAL);
//系统的全局并行队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
//自定义的并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    DISPATCH_QUEUE_SERIAL  //串行
    DISPATCH_QUEUE_CONCURREN  //并行
#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
任务
dispatch_sync(globalQueue, ^{
       //同步任务
    });
dispatch_async(globalQueue, ^{
       //异步任务
    });
其他使用
 dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, globalQueue, ^{
        //A
    });
    dispatch_group_async(group, globalQueue, ^{
        //B
    });
    //当此group,此队列中的所有任务都结束才执行此block
    dispatch_group_notify(group, globalQueue, ^{
        
    });

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//Enter group
dispatch_group_enter(group);
[manager GET:@"http://www.baidu.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    //Deal with result...
    //Leave group
    dispatch_group_leave(group);
}    failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    //Deal with error...
    //Leave group
    dispatch_group_leave(group);
}];
   dispatch_barrier_async(concurrentQueue, ^{
        for (int i=0; i<5; i++) {
            NSLog(@"=%@=====%d",[NSThread currentThread],i);
        }
    });
    dispatch_async(concurrentQueue, ^{
        for (int i=5; i<10; i++) {
            NSLog(@"=%@=====%d",[NSThread currentThread],i);
        }
    });
//主队列中的延时执行  时间单位是dispatch_time_t
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    });
    //任意队列中的延时执行
    dispatch_after(DISPATCH_TIME_NOW+30, globalQueue, ^{
        
    });
    dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        //默认线程安全
    });
    dispatch_apply(10, globalQueue, ^(size_t index) {
        //会执行10次   index顺序不确定
    });
上一篇下一篇

猜你喜欢

热点阅读