zoukankan      html  css  js  c++  java
  • 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);
    }
     
  • 相关阅读:
    pat乙级1018
    下拉框多选,出现这种情况,求大神帮我看看
    Filter 过滤器
    拦截器和过滤器区别
    Servlet 生命周期
    cannot simultaneously fetch multiple bags 问题的解决办法
    JPA规范及其它持久层框架
    数据库设计的三大范式
    装饰者模式
    Java 流
  • 原文地址:https://www.cnblogs.com/safiri/p/4076540.html
Copyright © 2011-2022 走看看