GCD

没事,复习一下GCD相关知识。

1、

串行   任务顺序执行 DISPATCH_QUEUE_SERIAL

并行    多个任务同时执行,自动开启多个线程同时执行任务   DISPATCH_QUEUE_CONCURRENT

同步    在当前线程中执行任务,不具备开启新线程的能力

异步    在新的线程中执行任务,具备开启新线程的能力

2、

1>dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); 

例子: dispatch_get_main_queue实际为一个特殊的串行队列,顺序输出1,2,3,4

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"1");
});
dispatch_async(mainQueue, ^{
NSLog(@"2");
});
dispatch_async(mainQueue, ^{
NSLog(@"3");
});
dispatch_async(mainQueue, ^{
NSLog(@"4");
});
2》dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT);
例子:dispatch_get_global_queue 实际也为一个全局队列,打印顺序不固定,2,4,1,3
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
NSLog(@"1");
});
dispatch_async(defaultQueue, ^{
NSLog(@"2");
});
dispatch_async(defaultQueue, ^{
NSLog(@"3");
});
dispatch_async(defaultQueue, ^{
NSLog(@"4");
});
3>单例中的运用dispatch_once
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"onceToken");
});
4>延迟加载dispatch_after
double delayInSeconds = 2.0;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, mainQueue, ^{
NSLog(@"延时执行的2秒");
});
5>调度组dispatch_group_t
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, defaultQueue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"1");
});
dispatch_group_async(group, defaultQueue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"2");
});
dispatch_group_notify(group, defaultQueue, ^{
NSLog(@"3");
});
以上代码也可以写成:
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(defaultQueue, ^{
NSLog(@"1");
dispatch_group_leave(group);
});
6>dispatch_barrier_async在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行.
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurrentQueue, ^(){
        NSLog(@"dispatch-1");
    });
    dispatch_async(concurrentQueue, ^(){
        NSLog(@"dispatch-2");
    });
    dispatch_barrier_async(concurrentQueue, ^(){
        NSLog(@"dispatch-barrier"); 
    });
    dispatch_async(concurrentQueue, ^(){
        NSLog(@"dispatch-3");
    });
    dispatch_async(concurrentQueue, ^(){
        NSLog(@"dispatch-4");
    });
//这个函数可以设置同步执行的block,它会等到在它加入队列之前的block执行完毕后,才开始执行。在它之后加入队列的block,则等到这个block执行完毕后才开始执行。 

7>执行某个代码dispatch_apply 重复执行某个代码
//生成全局队列
 6     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 7     
 8     
 9     /*! dispatch_apply函数说明
10      *
11      *  @brief  dispatch_apply函数是dispatch_sync函数和Dispatch Group的关联API
12      *         该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等到全部的处理执行结束
13      *
14      *  @param 10    指定重复次数  指定10次
15      *  @param queue 追加对象的Dispatch Queue
16      *  @param index 带有参数的Block, index的作用是为了按执行的顺序区分各个Block
17      *
18      */
19     dispatch_apply(10, queue, ^(size_t index) {
20         NSLog(@"%zu", index);
21     });
22     NSLog(@"done");
23     
24     /*!
25      *  @brief  输出结果
26      *
27      2016-02-25 19:24:39.102 dispatch_apply测试[2985:165004] 0
28      2016-02-25 19:24:39.102 dispatch_apply测试[2985:165086] 1
29      2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 4
30      2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 5
31      2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 6
32      2016-02-25 19:24:39.103 dispatch_apply测试[2985:165088] 3
33      2016-02-25 19:24:39.104 dispatch_apply测试[2985:165004] 7
34      2016-02-25 19:24:39.105 dispatch_apply测试[2985:165004] 8
35      2016-02-25 19:24:39.105 dispatch_apply测试[2985:165004] 9
36      2016-02-25 19:24:39.102 dispatch_apply测试[2985:165087] 2
37      2016-02-25 19:24:39.105 dispatch_apply测试[2985:165004] done
38      *  !!!因为在Global Dispatch Queue中执行,所以各个处理的执行时间不定
39      但done一定会输出在最后的位置,因为dispatch_apply函数会等待所以的处理结束
40      */



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值