iOS-GCD多线程编程详解7


iOS-GCD多线程编程详解7


这篇文章的主要讲解的是关于dispatch_time_t的dispatch_time()及其在app中的运用。


一.dispatch_time

要想创建一个dispatch_time_t变量,就可以通过dispatch_time()函数和dispatch_walltime() 两个函数创建。

1.dispatch_time_t  dispatch_time(dispatch_time_t when, int64_t delta);//返回值为dispatch_time_t的一个时间变量,传人的参数为when为参考时间,delta为时间差,就是返回时间与when的时间差。

2.dispatch_time_t dispatch_walltime(const struct timespec *when, int64_t delta);//该函数也是返回一个dispatch_time_t的变量,传人的参数when也是相对时间,delta是时间差。


二.dispatch_time的使用


1.做一个循环调用的定时器

timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC, 3 * NSEC_PER_SEC);
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"你好我是一个定时触发的时间源事件");
    });
    dispatch_resume(timer);


运行结果:

2015-01-11 10:21:11.007 GCDTest[665:23799] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:17.494 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:23.419 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:28.473 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:33.011 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:36.008 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:41.007 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:46.008 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:51.009 GCDTest[665:23800] 你好我是一个定时触发的时间源事件

2015-01-11 10:21:56.008 GCDTest[665:23800] 你好我是一个定时触发的时间源事件


运行结果:输出都在5的范围内。

2.使用dispatch_time_t的延迟调用


NSLog(@"第一次输出:%@",[NSDate date]);
    dispatch_queue_t que = dispatch_queue_create("", DISPATCH_QUEUE_SERIAL);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 4*10000000000),
                   que,
                   ^{
                       NSLog(@"第二次输出:%@",[NSDate date]);
                       
                   });

运行结果:设置的事延迟40秒,输出结果也为40左右

2015-01-11 10:34:15.009 GCDTest[848:29127] 第一次输出:2015-01-11 02:34:15 +0000

2015-01-11 10:34:55.011 GCDTest[848:29248] 第二次输出:2015-01-11 02:34:55 +0000


GCD系列总结:在app中的实际应用开发中GCD的使用也具体是这些,GCD编程最重要的几个要素是执行任务的Block设计,想要被执行的任务是同步还是异步,通过信号量来控制线程的执行,通过组任务和阻塞任务块来实现依赖顺序调用,延迟调用等。对于线程的管理就交给系统和框架吧。














posted @ 2015-01-11 10:42 fineman 阅读(...) 评论(...) 编辑 收藏