ios之GCD学习笔记(3)
来源:互联网 发布:郎咸平小三 知乎 编辑:程序博客网 时间:2024/04/28 02:28
/*
15、void dispatch_suspend(dispatch_object_t object)
会令队列挂起,但并不意味代码不会执行,它会继续执行未完成的任务
,但是未开始的任务将不会被执行
void dispatch_resume(dispatch_object_t object)
唤醒挂起的队列
*/
dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(myQueue, ^{ NSLog(@"呵呵"); sleep(1); NSLog(@"呼呼"); dispatch_resume(myQueue); }); dispatch_suspend(myQueue); dispatch_async(myQueue, ^{ NSLog(@"哈哈"); //挂起之后加入,则不会被执行,直到被唤醒 });
/*
上述代码会相继打印 呵呵 呼呼 哈哈
16、void dispatch_set_context(dispatch_object_t object, void *context);
可以给队列设置一个上下文
void * dispatch_get_context(dispatch_object_t object)
可以获取队列设定的上下文
注意:gcd不会帮我们释放上下文的内存
17、 void dispatch_set_finalizer_f(dispatch_object_t object,dispatch_function_t finalizer);
当队列的引用计数为0的时候,会调用fuction的方法,我们可以在该方法释放上下文内存
void func_final(void * value) { value = nil; NSLog(@"%@",value); } - (void)test{ dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); NSString* str = [NSString stringWithFormat:@"%@",@"呵呵"]; dispatch_set_context(myQueue, (__bridge void*)str); NSString* context = (__bridge NSString*)dispatch_get_context(myQueue); NSLog(@"%@",context); dispatch_set_finalizer_f(myQueue,func_final); }
18、dispatch_source_t
gcd中的定时器,文件监听,进程监听,Mach port监听
19、dispatch_source_t dispatch_source_create(dispatch_source_type_t type,
uintptr_t handle,unsigned long mask,dispatch_queue_t queue);
创建一个dispatch_source_t
第一个参数 监听的类型
DISPATCH_SOURCE_TYPE_TIMER 定时响应 DISPATCH_SOURCE_TYPE_SIGNAL 接收到UNIX信号时响应 DISPATCH_SOURCE_TYPE_READ IO操作,如对文件的操作、socket操作的读响应 DISPATCH_SOURCE_TYPE_WRITE IO操作,如对文件的操作、socket操作的写响应 DISPATCH_SOURCE_TYPE_VNODE 文件状态监听,文件被删除、移动、重命名 DISPATCH_SOURCE_TYPE_PROC 进程监听,如进程的退出、创建一个或更多的子线程、进程收到UNIX信号 DISPATCH_SOURCE_TYPE_MACH_SEND DISPATCH_SOURCE_TYPE_MACH_RECV 上面2个都属于Mach相关事件响应 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATCH_SOURCE_TYPE_DATA_OR 上面2个都属于自定义的事件,并且也是有自己来触发
第二个参数:可以理解为句柄、索引或id,假如要监听进程,需要传入进程的ID
第三个参数:可以理解为描述,提供更详细的描述,让它知道具体要监听什么
第四个参数:当事件发生时,将block添加至哪个队列来执行
*/
static dispatch_source_t timer; timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
/*
20、void dispatch_source_set_timer(dispatch_source_t source,
dispatch_time_t start,uint64_t interval,uint64_t leeway);
设置timer属性
第一个参数:timer (dispatch_source_t)
第二个参数:开始时间(dispatch_time_t 第1篇讲过)
第三个参数:间隔时间 单位是纳秒
第四个参数:误差 通常写0
说几个宏
NSEC_PER_SEC 一秒等于多少纳秒(第1篇出现过) NSEC_PER_MSEC 一毫秒等于多少纳秒 NSEC_PER_USEC 一微秒等于多少纳秒
由于这是基于纳秒的定时器,所以上面的三个宏会经常用到
换言之延迟一秒启动timer,相当于调用第一个timer,如果写0,会立马调用
,就达不到timer的效果
*/
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, 1.0*NSEC_PER_SEC); uint64_t interver = 1.0*NSEC_PER_SEC; dispatch_source_set_timer(timer,start,interver,0);
/*
21、void dispatch_source_set_event_handler(dispatch_source_t source,dispatch_block_t handler);
设置监听要执行的回调事件
第一个参数:source
第二个参数:回调
*/
dispatch_source_set_event_handler(timer,^{ }); dispatch_resume(timer);//注意:要想实现一个timer,必须调用dispatch_resume,并且将dispatch_source_t持有,否则你的timer无法启动,换言之timer不应该是局部变量
/*
22、void dispatch_source_cancel(dispatch_source_t source);
取消source
*/
dispatch_source_cancel(timer);
/*
23、void dispatch_source_set_cancel_handler(dispatch_source_t source,
dispatch_block_t handler);
设置取消的回调,当取消时候会调用handler
*/
dispatch_source_set_cancel_handler(timer, ^{ timer = nil; //释放timer,或者关闭文件等等 });
/*
24、long dispatch_source_testcancel(dispatch_source_t source);
检测是否dispatch源被取消,如果返回非0值则表明dispatch源已经被取消
*/
long result = dispatch_source_testcancel(timer);
/*
25、uintptr_t dispatch_source_get_handle(dispatch_source_t source);
获得create的第三个参数handle
unsigned long dispatch_source_get_mask(dispatch_source_t source);
获得create的第四个参数mask
26、void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler);
可用于设置dispatch源启动时调用block,调用完成后即释放这个block。也可在dispatch源运行当中随时调用这个函数。
*/
dispatch_source_set_registration_handler(timer,^{ });
- ios之GCD学习笔记(3)
- ios之GCD学习笔记(1)
- ios之GCD学习笔记(2)
- iOS学习笔记之GCD详解
- iOS学习笔记之GCD详解
- iOS 学习 之 gcd
- iOS 学习笔记 --- 多线程基础(3)--- GCD
- iOS并发编程(GCD)学习笔记
- iOS并发编程(GCD)学习笔记
- iOS并发编程(GCD)学习笔记
- iOS GCD 学习笔记(一)
- 学习笔记之GCD
- IOS学习笔记51--多线程编程之GCD
- iOS多线程学习之GCD
- iOS 多线程学习之GCD
- iOS多线程之GCD学习
- iOS-GCD学习之Group
- iOS多线程学习笔记(GCD、RunLoop、NSThread)
- windows下免安装版的mysql的正确安装,折腾出来的方法
- 一种通过自动脚本抓取Android 手机log的方法
- ios之GCD学习笔记(2)
- Mysql 5.7 information_schema 的status和variables表deprecated
- 指尖上的电商---(6)solrconfig.xml配置详解
- ios之GCD学习笔记(3)
- 关于gsoap工具soapcpp2.exe无法通过头文件生成wsdl接口描述语言文件的原因
- 指尖上的电商---(7)Solr索引基本操作
- Ubuntu run in Raspberry pi 2 之SD 卡镜像篇(ROS开发准备)
- amq原理
- JAVA学习之——深入分析Spring 与 Spring MVC容器
- 开发效率提升百分百的秘密
- 【背包专题汇总】
- CodeForces - 675A Infinite Sequence (模拟)水