• GCD7: 利用GCD延时后执行任务


    功能:

    你希望通过 GCD 指定一个延迟,延迟到后,继续执行相关代码。 

    方案:

    使用dispatch_after 和 dispatch_after_f函数

    讨论:

    通过Core Foundation,您可以在一段给定的时间之后调用对象中的选择器,这个调用可以使用 NSObject 类的performSelector:withObject:afterDelay:方法.
     
     
    在 GCD 中 我们可以使用 dispatch_after 和 dispatch_after_f 函数达到一样的目的,两个函数分别描述如下: 

    dispatch_after 在一段给定的、以纳秒为单位的时间段之后,将Block Object分派到一个分派队列。这个函数需要的参数有:

    Delay in nanoseconds

      在执行指定的 Block Object之前 GCD 必须在一个给定的分派队列 (由第二个参数指定) 上等待的纳秒数。

    Dispatch queue

      Block Object 在给定的延迟(由第一个参数指定)之后必须执行在其上执行的派送队列。

    Block object

      在指定的分派队列上等待一定纳秒后Block Object会被调用;它没有返回值并且不接参数。 

     
    dispatch_after_f 分派一个 C 函数到 GCD 在限定的、以纳秒限定的时间之后执行,这个函数接受 4 个参数:

    Delay in nanoseconds

      等待的纳秒数。

    Dispatch queue

      C 函数必须在给定延迟之后在其上执行分派送队列。

    Context
      一个值在堆中传递到了 C 函数的内存地址。
    C函数
      在特定时间段之后必须执行的 C 函数。 

    下面先看一个dispatch_after的例子:

    - (void)dispatchAfter{
        double delayInSeconds = 2.0;
        dispatch_time_t delayInNanoSeconds = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds*NSEC_PER_SEC);
        dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_after(delayInNanoSeconds, concurrentQueue, ^{
            NSLog(@"延迟执行");
        });
    }
    对于 dispatch_after 和 dispatch_after_f 函数纳秒级延迟参数必须是类 dispatch_time_t,它是绝对时间的抽象表示形式。要得到这个参数的值,你要用此代码中演 示的 dispatch_time 函数:

    dispatch_time(dispatch_time_t when, int64_t delta)

    例如,表示一个从现在开始 3 秒的时间,你可以这样来写你的代码: 
    dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, 3.0f*NSEC_PER_SEC);

    现在我们看看如何使用dispatch_after_f函数:

    void processSomething(void *paramContext){
        /* Do your processing here */
        NSLog(@"Processing...");
    }
    - (void)dispatchAfterf{
        dispatch_time_t delayInNanoSenconds = dispatch_time(DISPATCH_TIME_NOW, 2.0f*NSEC_PER_SEC);
        dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_after_f(delayInNanoSenconds, concurrentQueue, NULL, processSomething);
    }
     
  • 相关阅读:
    消息队列系列——启蒙(一)
    重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]
    重新整理数据结构与算法——八皇后问题解决[十]
    重新整理数据结构与算法——迷宫算法[九]
    重新整理数据结构与算法——逆波兰表达计算器[八]
    lowdb 在electron 使用中注意的问题
    apollo客户端springboot实战(四)
    apollo在liunx环境实战(三)
    apollo入门demo实战(二)
    设计模式总结
  • 原文地址:https://www.cnblogs.com/safiri/p/4076540.html
Copyright © 2020-2023  润新知