美文网首页开发知识点
iOS GCD使用dispatch_after、dispatch

iOS GCD使用dispatch_after、dispatch

作者: 没脑子的程序员 | 来源:发表于2019-03-05 11:08 被阅读0次

dispatch_after

我们经常会有需要一个方法或者处理需要延迟一段时间执行,dispatch_after函数就是用来实现这种功能

    NSLog(@"2秒后执行");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"等了2秒,开始执行任务");
        sleep(1);
        NSLog(@"任务执行完成");
    });

打印结果如下

16:44:04.949 2秒后执行
16:44:06.950 等了2秒,开始执行任务
16:44:07.955 任务执行完成

dispatch_after有三个参数,第一个参与用来指定时间,传入的是dispatch_time_t类型的值,通过dispatch_time和dispatch_walltime函数生成。第二个参数是任务添加的队列,第三个是任务的block。

dispatch_after的功能是在指定的时间将任务加入到队列中,而不是在指定的时间执行,如果所在的队列上有耗时任务在执行,那么时间上可能出现误差。

    NSLog(@"2秒后执行");
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"等了2秒,开始执行任务");
        sleep(1);
        NSLog(@"任务执行完成");
    });
    
    sleep(5);

打印结果

10:04:41.799 2秒后执行
10:04:46.825 等了2秒,开始执行任务
10:04:47.827 任务执行完成

dispatch_time

dispatch_time需要传入两个参数,第一个参数是时间点,第二个参数是时间长度,函数的作用就是获取时间点经过时间长度之后的时间点。第一个参数我们经常使用的是DISPATCH_TIME_NOW,表示现在这个时间点。第二个参数表示的时间长度使用数组* NSEC_PER_SEC的方式获得。

  • NSEC_PER_SEC 表示秒
  • NSEC_PER_MSEC 表示毫秒
  • NSEC_PER_USEC 表示微秒

dispatch_walltime

dispatch_walltime函数的第一个参数需要一个struct timespec类型的值,第二个参数是以纳秒为单位的延迟时间。

    //设置时间点为2秒后
    NSTimeInterval iT = [[NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]] timeIntervalSince1970];

    struct timespec time;
    time.tv_sec = (NSInteger)iT;
    //比时间点再晚10秒
    dispatch_time_t timer = dispatch_walltime(&time, 10*NSEC_PER_SEC);
    NSLog(@"12秒后开始任务");
    dispatch_after(timer, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSLog(@"任务开始");
        
        sleep(1);

        NSLog(@"任务完成");
    });

打印结果

11:05:40.685 12秒后开始任务
11:05:52.000 任务开始
11:05:53.003 任务完成

相关文章

  • JSPatch 学习二 -- 基础用法(3)

    8. GCD 使用 dispatch_after() ;dispatch_async_main() ;dispat...

  • iOS GCD使用dispatch_after、dispatch

    dispatch_after 我们经常会有需要一个方法或者处理需要延迟一段时间执行,dispatch_after函...

  • GCD简单使用

    基础使用 GCD的延时执行方法 dispatch_after GCD的一次性代码(只执行一次) dispatch_...

  • 延迟调用方法总结

    延迟调用自己代理的方法: //GCD延迟dispatch_after(dispatch_time(DISPATCH...

  • dispatch_after

    dispatch_after属于GCD,能够实现延迟执行的语法,或者说是GCD中延迟执行的函数。使用dispatc...

  • iOS dispatch_after

    dispatch_after是来延迟执行的GCD方法,dispatch_after能让我们添加进队列的任务延时执行...

  • GCD中的dispatch_after使用说明

    dispatch_after解说 dispatch_after是来延迟执行的GCD方法,因为在主线程中我们不能用s...

  • GCD中常用的方法

    主要是记录下GCD中常用的一些方法: dispatch_after dispatch group dispatch...

  • dispatch_time_t 的创建

    开发中常用到GCD方法dispatch_after(<#dispatch_time_t when#>, <#dis...

  • 线程篇之GCD

    本篇是是Objective-C 高级编程中多线程GCD部分 笔记. dispatch_after dispatch...

网友评论

    本文标题:iOS GCD使用dispatch_after、dispatch

    本文链接:https://www.haomeiwen.com/subject/fssiuqtx.html