1

很神奇的是,在TextMate上,我可以在本地html文件中更改一行(Mountain Lion上的网络共享,使用url之类的url http://macmini.local/~mike/page.html),然后在TextMate里面按Cmdr右键,Chrome、Firefox和Safari上的网页都会自动刷新内容。我想知道它是如何完成的,它是否取决于应用程序是否正在观察该文件(或者它可以选择不观察)。听说iOS有KVO,功能类似于Mac OS X上的绑定,但不知道上面的行为是不是OS X绑定完成的?)。

4

1 回答 1

2

KVO 和绑定适用于对象,而不是文件。

有几种方法可以通知其他应用程序文件已更改:

  • FNNotify是旧文件管理器中已弃用的功能。它需要一个FSRef. 还有FNNotifyByPath; 你可以猜到这需要什么。
  • -[NSWorkspace noteFileSystemChanged:]采用路径并同样通知可能正在查看文件的任何内容。
  • 文件协调是一个独立的系统。它可能与上述更原始的方法集成,但我不确定也不会指望它。文件协调员处理通知;文件演示者(包括基于文档的应用程序中的文档)处理观看。

某些kevent应用程序会在您不执行上述任何操作的情况下注意到更改,因为它们具有使用、、、dispatch_sourceFSEvents 或其他方式查看文件的较旧的手写代码,但大多数应用程序不采取此类额外措施。

如果您的应用程序是基于文档的,则您无需执行任何操作。文件机器为您处理一切。您只需像往常一样实现读取和写入方法。

对于非基于文档的应用程序,我将首先实现文件协调,并且仅noteFileSystemChanged:在见证 FC 没有通知我关心的应用程序后才使用。

于 2012-09-29T05:03:55.943 回答