4月11日 GCD 总结(二)
来源:互联网 发布:中传女被害案 知乎 编辑:程序博客网 时间:2024/05/28 06:04
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, ^{
});
- 4月11日 GCD 总结(二)
- 4月11日 GCD 总结(一)
- week9---11月4日 JS基础(二)
- 2015/4/11日-月总结
- 11月6日总结
- 8月11日总结
- 3月11日总结
- 11月19日总结
- 8月11日总结
- 11月27日 总结
- 11月29日 总结
- 8月4日总结
- week12---11月27日 JS内置对象(二)
- 11月4日
- 11月4日
- CDA数据分析学习4月11日总结
- 2016年11月4日学习总结
- 2017年11月4日 第二十六次总结
- hibernate+sqlserver2005连接对hibernate.cfg.xml文件的配置
- 立波育儿百科,在手机上的育儿百科使您随时随地查看别人的育儿心得、专家的精彩讲解,使怀孕、养育孩子成为了一种乐趣
- 【SDOI2008】【link-cut tree】洞穴勘测
- 【转】Java工具类——资源文件解析类PropertiesUtil
- win7 jdk1.7环境变量配置
- 4月11日 GCD 总结(二)
- C++ TCP Server
- HDU 1010 Tempter of the Bone 深度优先搜索(DFS)
- [bxd学习java基本点]13泛型类,泛型方法,当定义二种类型的泛型方法时,用迭代器的方法
- OpenCV中将BGR图像转为HSV,并显示
- linux常用命令——重定向
- 全面解析Ext模板XTemplate(转)
- C++ TCP Client
- GDB的基本用法