zoukankan      html  css  js  c++  java
  • 4月11日 GCD 总结(二)

    4月11日 GCD 总结(二)
    一、 指定一定数量的延迟之后,使用 GCD 来执行代码-- 使用 Dispatch_after Dispatch_after_f 函数

    1、 dispatch_after

    在一段给定的、以纳秒为单位的时间段之后,将 Block Object 分派到一个分派队列。这

    个函数需要的参数有:

    Delay in nanoseconds

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

    Dispatch queue

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

    Block object

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

     


    int64_t delayInSeconds = 20.0;

        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

            //

            NSLog(@"oh fuck!");

        });



    像你看到的那样,对于 dispatch_after dispatch_after_f 函数纳秒级延迟参数必须是类 dispatch_time_t,它是绝对时间的抽象表示形式。要得到这个参数的值,你要用此代码中演示的 dispatch_time 函数。这里是您可以传递给 dispatch_time 函数的参数:

    Base time

    假设这个值为 B,Delta parameter 值为 D,通过这个函数结束的时间就等于 B+D。您可以设置此参数的值到 DISPATCH_TIME_NOW 来把现在作为基时间,然后从现在使用 Delta 参数来确定 Delta

    Delta to add to base time

    这个参数是要增加到计算时间参数来获取函数结果的纳秒。例如,表示一个从现在开始 3 秒的时间,你可以这样来写你的代码:

    dispatch_time_t delay =
    dispatch_time(DISPATCH_TIME_NOW, 3.0f * NSEC_PER_SEC);
    或者表示从现在开始半秒的时间:
    dispatch_time_t delay =
    dispatch_time(DISPATCH_TIME_NOW, (1.0 / 2.0f) * NSEC_PER_SEC); 





    2、dispatch_after_f

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

    Delay in nanoseconds

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

    Dispatch queue

    C 函数 (由第四个参数指定) 必须在给定延迟(由第一个参数指定)之后在其上执行分派送队列。

    Context
    一个值在堆中传递到了 C 函数的内存地址 (举例见 5.5)
    C 函数
    在特定时间段
    (由第一个参数指定)之后必须执行的 C 函数在给定分派队列中(由第二个

    参数指定)的地址。

     
    {

    double delayInSeconds = 2.0;

        dispatch_time_t delayInNanoSeconds=dispatch_time(DISPATCH_TIME_NOW, delayInNanoSeconds*NSEC_PER_SEC);

        dispatch_queue_t cur=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_after_f(delayInNanoSeconds, cur, NULL, processSomething);

    }


    void processSomething(void *paramContext)

    {

        /* Do your processing here */

        NSLog(@"Processing...");

    }


    二、在 GCD 上一个任务最多执行一次--使用 dispatch_once 函数



    函数 dispatch_once,它接受 2

    参数:

    Token
    一个类 dispatch_once_t Token 持有 GCD 是代码块第一次执行时生成的 Token。如果

    你想最多一次执行一段代码,那么无论什么时候这个代码在 APP 中被调用你必须指定在这

    个方法中指定同样的 Token

     Block Object

    Block Object 最多执行一次。这个 Block Object 返回时没有值并且没有参数。 dispatch_once 总是被发出呼叫的代码用来在当前队列上执行任务,它可能是一个串行队列、一个并发队列或者一个主队列。


     staticdispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            

        });






  • 相关阅读:
    javascript 心得
    pdfbox加载pdf时遇到wrappedioexception报错处理方式
    缩写
    Java学习——连接数据库
    oracle 关于null值排序
    Java学习笔记(二)
    kvm安装windows系统
    导入excel文件信息
    shell脚本根据端口号自启动jar
    spirngboot使用netty实现UDP协议接收数据
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3020059.html
Copyright © 2011-2022 走看看