分派源提供了高效的方式来处理事件,这种方式是通过发送通知,接受通知的方式实现; 但有的时候系统发送通知有延迟:已经处理完多次事件才进行通知,这时候会把事件源合并成一个事件传递过来,不会丢失; 分派源在性能至关重要的场合会用到,但是一般都不会被用到;
/**
* DISPATCH_SOURCE_TYPE_DATA_ADD 方式可以累积传递过来的值
* 在同一时间只能有一个事件源被分配
* 传递过来的事件源可以用 dispatch_source_get_data 来获取,获取到的value值是通过 dispatch_source_merge_data 发送的;
* 我们用 totalSourceCount 来累积传递过来的数据源总数
*/
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue());
__block long totalSourceCount = 0;
dispatch_source_set_event_handler(source, ^{
long value = dispatch_source_get_data(source);
NSLog(@"-----%ld",value);
totalSourceCount += value;
});
dispatch_resume(source);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i =0;i<10; i++) {
/**
* dispatch_source_merge_data 在任何线程中都可以使用,必须传递 >0 的值
* 传递的值可以是已经下载的字节数,可以是下载后的百分比 ,可以是已经存入数据库的条目数
*/
dispatch_source_merge_data(source, 1);
[NSThread sleepForTimeInterval:0.1];
}
});
- 下面是输出结果,每隔1s钟会输出一个结果
-----2
-----2
-----2
-----2
-----2
-----2
-----2
-----2
-----2
-----2