Macos 如何使用KFSevents包装的KFSeventStreamEventFlagEventIDs?
我试图了解如何将Macos 如何使用KFSevents包装的KFSeventStreamEventFlagEventIDs?,macos,cocoa,fsevents,Macos,Cocoa,Fsevents,我试图了解如何将kfsevents事件标志与FSEvents一起使用 根据文档,当事件id计数器环绕时,会将标志发送到已注册实例,从而使以前的事件id过时 现在让我们设想以下场景: 我在我的应用程序中注册FSEvents 处理完FSEvents(例如,我的应用程序退出)后,我保存处理事件时遇到的最后一个事件id,以便能够重播该id的更改 当我的应用程序未运行时,事件id计数器会自动关闭 我的问题是:我怎么知道柜台是怎么回事?(因此需要我重新扫描整个目录结构。)编辑: 事件ID不换行 原因如下
kfsevents
事件标志与FSEvents
一起使用
根据文档,当事件id计数器环绕时,会将标志发送到已注册实例,从而使以前的事件id过时
现在让我们设想以下场景:
- 我在我的应用程序中注册
李>FSEvents
- 处理完
(例如,我的应用程序退出)后,我保存处理事件时遇到的最后一个事件id,以便能够重播该id的更改李>FSEvents
- 当我的应用程序未运行时,事件id计数器会自动关闭
>>> ms_per_year = 1000*60*60*24*365
>>> d64 = 2**64
>>> d64/ms_per_year
584942417L
编辑:
事件ID不换行
原因如下:假设您的计算机每毫秒生成1个文件系统事件。这意味着它将每年生成ms_=31536000000个文件系统事件。因此,计数器将需要5亿多年才能环绕64位边界
>>> ms_per_year = 1000*60*60*24*365
>>> d64 = 2**64
>>> d64/ms_per_year
584942417L
如果设置了
kFSEventStreamEventFlagEventIdsWrapped
,则表示环绕的64位事件ID计数器。因此,先前发出的事件ID不再是FSEventStreamCreate()
函数的sinceWhen参数的有效参数
下次您应该为
fseventstreamventid
使用kfseventstreamventidsinconow
时,您必须重新扫描所有目录。如果设置了kfseventstreamventflageventidswrapped
,则意味着64位事件ID计数器被环绕。因此,先前发出的事件ID不再是FSEventStreamCreate()
函数的sinceWhen参数的有效参数
下次您应该为
fseventstreamventid
使用kfseventstreamventidsincenow
,并且您必须重新扫描所有目录。我现在直接从苹果得到了答案
这种情况一开始就错了。保存最后处理的事件id时,还必须保存事件流的UUID。事件id仅对由其UUID标识的给定事件流有效(请参见FSEventsCopyUUIDForDevice()
)
每当事件id计数器换行时,就会生成一个新的事件流UUID。因此,如果在事件id计数器结束后重新启动应用程序,则存储的最后一个事件id将不再有效,并且您将知道它,因为事件流UUID将不同
如果您遇到
kFSEventStreamEventFlagEventIdsWrapped
标志,则表示在应用程序打开时计数器被环绕。然而,没有什么特别的事情要做。如果要保存最后一个事件id,只需确保获取新的事件流UUID即可。我现在直接从Apple获得了答案
这种情况一开始就错了。保存最后处理的事件id时,还必须保存事件流的UUID。事件id仅对由其UUID标识的给定事件流有效(请参见FSEventsCopyUUIDForDevice()
)
每当事件id计数器换行时,就会生成一个新的事件流UUID。因此,如果在事件id计数器结束后重新启动应用程序,则存储的最后一个事件id将不再有效,并且您将知道它,因为事件流UUID将不同
如果您遇到
kFSEventStreamEventFlagEventIdsWrapped
标志,则表示在应用程序打开时计数器被环绕。然而,没有什么特别的事情要做。如果要保存最后一个事件id,只需确保获取新的事件流UUID。我知道事件id不太可能包装;你没有回答这个问题。我只是想了解如何充分使用FSEvents
API。(另外,如果事件ID没有包装,为什么要创建kFSEventStreamEventFlagEventIdsWrapped
标志?)您在版本之前的回答中说过,我不应该将事件ID保存到磁盘。你能详细说明一下吗?(文档似乎不同意:FSEventStreamGetLatestEventId()->[…]客户端可以持久存储此值,只要它们还存储设备的UUID
)。谢谢你的时间。嗯,我认为包装标志在那里,因为一些苹果工程师没有真正掌握64位整数的巨大空间。也许你可以保存事件ID,但也许它会包装两次,当你的应用程序没有运行时,你会怎么做?我是说,真的,拜托,它只是没有包装。只需打印几个事件ID,它们在一台运行多年的计算机上大约是123_000_000。即使您找到了处理事件ID包装的方法。。。你将如何现实地测试它?你确定苹果的工程师们真的测试过这个标志是否有效吗?如果是,它们是如何保存的?事实上,您可以保存事件ID,但还必须保存事件流UUID,因为事件ID仅对给定的事件流有效。计数器换行时,事件流UUID发生更改。更多信息,请参阅我接受的答案。顺便说一句,苹果可以通过手动将事件ID设置为2**64-42;)来非常轻松地测试wrap我当然希望他们做到了;测试您编写的任何代码都是基本的编码101。@Frizlab:只有当您尝试测试环绕时,它才会环绕。实际上,它永远不会结束(除非你相信在500000000年后会有OSX…),我知道事件ID不太可能结束;你不回答这个问题