-
Timer dispatch sources generate periodic notifications. 定期产生的(DISPATCH_SOURCE_TYPE_TIMER)
-
Signal dispatch sources notify you when a UNIX signal arrives. 接受到UNIX信号时产生的 (DISPATCH_SOURCE_TYPE_SIGNAL)
-
Descriptor sources notify you of various file- and socket-based operations, such as: 为提示多种文件或socket操作产生的,比如:
-
When data is available for reading 文件可读 (DISPATCH_SOURCE_TYPE_READ)
-
When it is possible to write data 文件可写 (DISPATCH_SOURCE_TYPE_WRITE)
-
When files are deleted, moved, or renamed in the file system 文件在系统中被删除,移动或重命名 (DISPATCH_SOURCE_TYPE_VNODE)
-
When file meta information changes 文件元信息被改变
-
-
Process dispatch sources notify you of process-related events, such as: 为提示有关进程的事件而产生的(DISPATCH_SOURCE_TYPE_PROC),比如:
-
When a process exits 退出一个进程
-
When a process issues a
fork
orexec
type of call 进程发起一个fork或exec类型调用 -
When a signal is delivered to the process 信号递送至进程
-
-
Mach port dispatch sources notify you of Mach-related events. 为提示有关Mach相关事件而产生的 (DISPATCH_SOURCE_TYPE_MACH_SEND DISPATCH_SOURCE_TYPE_MACH_RECV)
-
Custom dispatch sources are ones you define and trigger yourself. 用户自定义且自己触发的 (DISPATCH_SOURCE_TYPE_DATA_ADD DISPATCH_SOURCE_TYPE_DATA_OR)
- 用
dispatch_source_create
创建dispatch source,dispatch_source_t dispatch_source_create( dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t queue);
第一个参数代表:dispatch source类型,最后一个是block会进入的queue,用来执行事件处理器和取消处理器,第二三个参数在会根据source类型设置。 - 配置dispatch source:
- 用dispatch_source_set_event_handler设置dispatch source的事件处理器,就是响应了,干什么。
- 如果是计时器,用dispatch_source_set_timer函数设置定时器信息
void dispatch_source_set_timer( dispatch_source_t source, dispatch_time_t start,//开始时间 uint64_t interval,//时间间隔,纳秒级别的 uint64_t leeway);//系统可延迟的时间,纳秒级别的,就是精度
- 可以选择添加一个取消source后的事件处理器,也可以忽略,取消处理器在dispatch soruce释放之前执行清理工作,使用描述符或Mach port的dispatch source必须设置取消处理器;
- source默认是挂起的,需要恢复,用
dispatch_resume。
3.修改queue
假如需要一个一分钟报时一次的时钟,dispatch_time 是之于计算机时间,是相对时间,dispatch_walltime 是之于挂钟,是绝对时间,代码如下:
/* step 1 */
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,//类型:定时器
0, 0,
queue);//block会被压入queue执行
/* step 2 */
dispatch_source_set_timer(timer,//dispatch source
dispatch_time(DISPATCH_TIME_NOW, 0* NSEC_PER_SEC),//现在开始
1* NSEC_PER_SEC,//间隔 1s
0);//精度0
/* step 3 */
dispatch_source_set_event_handler(timer, ^{
NSLog(@"!");//整秒报时时的操作
});
/* step 4 */
dispatch_resume(timer);//恢复source
5.DISPATCH_SOURCE_TYPE_DATA_ADD/ DISPATCH_SOURCE_TYPE_DATA_OR
NSArray *name = @[@"a",@"b",@"c",@"d",@"e"];
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue());
dispatch_source_set_event_handler(source, ^{
NSLog(@"%lu 人已交卷",dispatch_source_get_data(source));
});
dispatch_resume(source);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(5, queue, ^(size_t index) {
NSLog(@"收到 %@ 试卷",name[index]);
dispatch_source_merge_data(source, 1);
});
这个是用户自己完成某些操作后,触发事件,然后响应事件。
dispatch_source_merge_data发出信号,然后执行事件处理器中的代码。 dispatch_source_merge_data 有两个参数,第一个是source,第二个是一个unsigned long属性,
DISPATCH_SOURCE_TYPE_DATA_ADD 是将每一个异步线程中发送的这些数据加起来,_OR是将这些数据逻辑与运算。
6. dispatch_source_cancel
dispatch_source_cancel异步取消一个source,取消之后不会再发送新的事件,无法撤销,之后会执行取消处理器代码。取消时正在执行的代码不会停止。