Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何使用KFSevents包装的KFSeventStreamEventFlagEventIDs?_Macos_Cocoa_Fsevents - Fatal编程技术网

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
  • 处理完
    FSEvents
    (例如,我的应用程序退出)后,我保存处理事件时遇到的最后一个事件id,以便能够重播该id的更改
  • 当我的应用程序未运行时,事件id计数器会自动关闭
我的问题是:我怎么知道柜台是怎么回事?(因此需要我重新扫描整个目录结构。)

编辑:

事件ID不换行

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

>>> 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不太可能结束;你不回答这个问题