1

我试图了解如何将kFSEventStreamEventFlagEventIdsWrapped事件标志与FSEvents.

根据文档,当事件 id 计数器回绕时,该标志被发送到已注册的实例,从而使之前的事件 id 过时。

现在让我们想象以下场景:

  • FSEvents在我的申请中注册;
  • 完成处理后FSEvents(例如,我的应用程序退出),我保存在处理事件时遇到的最后一个事件 id,以便能够从该 id 重播更改;
  • 当我的应用程序没有运行时,事件 id 计数器会环绕。

我的问题是:我怎么知道周围的柜台?(因此需要我重新扫描整个目录结构。)

4

3 回答 3

1

我现在直接从 Apple 那里得到了答案。

这个场景一开始就错了。保存最后处理的事件 id 时,您还必须保存事件流的 UUID。事件 id 仅对给定的事件流有效,由其 UUID 标识(请参阅 参考资料FSEventsCopyUUIDForDevice())。

每当事件 id 计数器回绕时,就会生成一个新的事件流 UUID。因此,如果您在事件 id 计数器环绕后重新启动应用程序,您存储的最后一个事件 id 将不再有效,并且您会知道它,因为事件流 UUID 将不一样。

如果您遇到该kFSEventStreamEventFlagEventIdsWrapped标志,则表示您的应用程序打开时计数器环绕。但是,没有什么特别的事情要做。如果要保存最后一个事件 ID,则应该确保获取新的事件流 UUID。

于 2014-10-09T14:39:24.723 回答
0

编辑:

事件 ID 不换行。

原因如下:假设您的机器每毫秒生成 1 个文件系统事件。这意味着它将每年生成 ms_per_year=31536000000 个文件系统事件。因此,计数器绕到 64 位边界还需要 5 亿多年的时间。

>>> ms_per_year = 1000*60*60*24*365
>>> d64 = 2**64
>>> d64/ms_per_year
584942417L
于 2014-04-01T16:18:41.400 回答
0

如果kFSEventStreamEventFlagEventIdsWrapped设置,则表示 64 位事件 ID 计数器环绕。因此,以前发布的事件 ID 不再是FSEventStreamCreate()函数的 sinceWhen 参数的有效参数。[1]

下次您应该使用kFSEventStreamEventIdSinceNowforFSEventStreamEventId并且您必须重新扫描所有目录。

于 2014-10-07T06:41:04.093 回答