现在的位置: 首页 > 综合 > 正文

4月11日 GCD 总结(二)

2018年01月26日 ⁄ 综合 ⁄ 共 2056字 ⁄ 字号 评论关闭
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 总是被发出呼叫的代码用来在当前队列上执行任务,它可能是一个串行队列、一个并发队列或者一个主队列。

 static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

    });

抱歉!评论已关闭.