iOS-GCD多线程编程详解3

来源:互联网 发布:网络打印机ip地址设置 编辑:程序博客网 时间:2024/05/18 15:27


iOS-GCD多线程编程详解3


接着GCD多线程编程详解系列,今天主要对dispatch_after,dispatch_barrier_async的使用。


一.dispatch_after的使用

voiddispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);
函数功能说明:这函数的主要作用是提交block到queue派送队列中,该block不是马上执行而是在规定的时间when执行,不如现在往后5秒执行就是现在的时间加上5秒钟。

返回值为空

参数说明:

when:说明什么使用执行block块,如果你填入现在执行的时间DISPATCH_TIME_NOW的话,就会被编译器优化为dispatch_async,如果你填入DISPATCH_TIME_FOREVER,block块永远也不会执行,或者呗编译器优化掉,通常时间使用dispatch_time() 和dispatch_walltime()这两个函数来制定运行的时间。

queue:block提交到的执行队列

block:执行的任务块


dispatch_time的使用:

dispatch_time(DISPATCH_TIME_NOW, 1)这样表示现在之后的十亿分之一秒,如果你想要dispatch_after中的block在5秒钟后运行,when参数就位

dispatch_time(DISPATCH_TIME_NOW,5*1000000000)或者dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 *NSEC_PER_SEC))其中NSEC_PER_SEC表示十亿,其中运行不可能达到结对的精确,会存在少许偏差。


NSDate *before = [NSDate date];    NSLog(@"%@",before);    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        NSLog(@"dispatch after");        dispatch_async(dispatch_get_main_queue(), ^{            NSLog(@"%@",[NSDate date]);        });    });

运行结果:

2015-01-06 23:20:43.723 GCDTest[833:41121] 2015-01-06 15:20:43 +0000

2015-01-06 23:20:49.221 GCDTest[833:41121] dispatch after

2015-01-06 23:20:49.221 GCDTest[833:41121] 2015-01-06 15:20:49 +0000

除去误差和输出的时间大概就是5秒左右。


二.dispatch_barrier_async的使用


voiddispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

函数说明:单纯的从名字来说就是一个拦路的block,这个队列在这个block之前加入的block运行完成之后在运行这个block,这个block运行完成之后才运行后面的block。

API的说明翻译:该函数是给queue提交一个看门的block,相比同步和异步调用,它用于读写操作还是要更有效率,特别要注意的是该函数只对属性为

DISPATCH_QUEUE_CONCURRENT的队列有效,只有block被调用之后后面被加入的才被执行,如果改队列是通过dispatch_get_global_queue()或者是非DISPATCH_QUEUE_CONCURRENT队列的话,该函数的执行效果和dispatch_async()/dispatch_sync()一样。

参数说明:

queue:block被提交的队列,改队列是DISPATCH_QUEUE_CONCURRENT的才有效,否则该函数和同步调用异步调用没有什么区别。

block:被提交的任务block


使用情况:

    dispatch_queue_t que = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);        dispatch_async(que, ^{        NSLog(@"block1");    });    dispatch_async(que, ^{        NSLog(@"block2");    });    dispatch_async(que, ^{        NSLog(@"block3");    });        dispatch_barrier_async(que, ^{        NSLog(@"你好我是barrier block");    });    dispatch_async(que, ^{        NSLog(@"block4");    });    dispatch_async(que, ^{        NSLog(@"block5");    });    dispatch_async(que, ^{        NSLog(@"block6");    });

运行结果:

1:

2015-01-06 23:44:03.217 GCDTest[863:48123] block1

2015-01-06 23:44:03.217 GCDTest[863:48124] block2

2015-01-06 23:44:03.217 GCDTest[863:48122] block3

2015-01-06 23:44:03.218 GCDTest[863:48122]你好我是barrier block

2015-01-06 23:44:03.218 GCDTest[863:48124] block5

2015-01-06 23:44:03.218 GCDTest[863:48124] block6

2015-01-06 23:44:03.219 GCDTest[863:48122] block4

2.

2015-01-06 23:45:23.194 GCDTest[877:48936] block2

2015-01-06 23:45:23.194 GCDTest[877:48933] block1

2015-01-06 23:45:23.194 GCDTest[877:48934] block3

2015-01-06 23:45:23.195 GCDTest[877:48934]你好我是barrier block

2015-01-06 23:45:23.195 GCDTest[877:48934] block4

2015-01-06 23:45:23.195 GCDTest[877:48934] block5

2015-01-06 23:45:23.196 GCDTest[877:48934] block6

3.

2015-01-06 23:45:47.709 GCDTest[882:49217] block1

2015-01-06 23:45:47.709 GCDTest[882:49214] block3

2015-01-06 23:45:47.709 GCDTest[882:49215] block2

2015-01-06 23:45:47.710 GCDTest[882:49215]你好我是barrier block

2015-01-06 23:45:47.710 GCDTest[882:49214] block5

2015-01-06 23:45:47.710 GCDTest[882:49214] block6

2015-01-06 23:45:47.710 GCDTest[882:49215] block4

结果分析:barrier block的执行顺序都没有变,其他的都是并发执行,如果加入的队列是顺序队列的话,就会按照加入的先后顺序执行


说明图解如下:


下一张将会讲到dispatch_group及和本章的合用。

0 0
原创粉丝点击