我在并发编程指南中找到了答案。我最初查看了GCD参考资料但没有运气。指南中相关的一行是:
对于监视文件系统活动的描述符调度源,此函数返回表示发生事件类型的常量。有关常量的列表,请参见dispatch_source_vnode_flags_t枚举类型。
以下是如何使用它的示例。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
int fildes = open("path/to/some/file", O_EVTONLY);
__block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,fildes,
DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE,
queue);
dispatch_source_set_event_handler(source, ^
{
unsigned long flags = dispatch_source_get_mask(source);
if(flags & DISPATCH_VNODE_DELETE)
printf("DISPATCH_VNODE_DELETE\n");
if(flags & DISPATCH_VNODE_WRITE)
printf("DISPATCH_VNODE_WRITE\n");
if(flags & DISPATCH_VNODE_EXTEND)
printf("DISPATCH_VNODE_EXTEND\n");
if(flags & DISPATCH_VNODE_ATTRIB)
printf("DISPATCH_VNODE_ATTRIB\n");
if(flags & DISPATCH_VNODE_LINK)
printf("DISPATCH_VNODE_LINK\n");
if(flags & DISPATCH_VNODE_RENAME)
printf("DISPATCH_VNODE_RENAME\n");
if(flags & DISPATCH_VNODE_REVOKE)
printf("DISPATCH_VNODE_REVOKE\n");
});
dispatch_source_set_cancel_handler(source, ^(void)
{
close(fildes);
});
dispatch_resume(source);
[blockSelf watchStyleSheet:path];
改为[blockSelf watchConfigFile:path];
。 - Stéphane Bruckertsource
没有被赋值,因此它不需要是 __block
。 - user102008dispatch_source_get_data
而不是dispatch_source_get_mask
。使用别人的代码却不真正理解它的荣耀... - Mojo66