很神奇的是,在TextMate上,我可以在本地html文件中更改一行(Mountain Lion上的网络共享,使用url之类的url http://macmini.local/~mike/page.html
),然后在TextMate里面按Cmdr右键,Chrome、Firefox和Safari上的网页都会自动刷新内容。我想知道它是如何完成的,它是否取决于应用程序是否正在观察该文件(或者它可以选择不观察)。听说iOS有KVO,功能类似于Mac OS X上的绑定,但不知道上面的行为是不是OS X绑定完成的?)。
问问题
403 次
1 回答
2
KVO 和绑定适用于对象,而不是文件。
有几种方法可以通知其他应用程序文件已更改:
FNNotify
是旧文件管理器中已弃用的功能。它需要一个FSRef
. 还有FNNotifyByPath
; 你可以猜到这需要什么。-[NSWorkspace noteFileSystemChanged:]
采用路径并同样通知可能正在查看文件的任何内容。- 文件协调是一个独立的系统。它可能与上述更原始的方法集成,但我不确定也不会指望它。文件协调员处理通知;文件演示者(包括基于文档的应用程序中的文档)处理观看。
某些kevent
应用程序会在您不执行上述任何操作的情况下注意到更改,因为它们具有使用、、、dispatch_source
FSEvents 或其他方式查看文件的较旧的手写代码,但大多数应用程序不采取此类额外措施。
如果您的应用程序是基于文档的,则您无需执行任何操作。文件机器为您处理一切。您只需像往常一样实现读取和写入方法。
对于非基于文档的应用程序,我将首先实现文件协调,并且仅noteFileSystemChanged:
在见证 FC 没有通知我关心的应用程序后才使用。
于 2012-09-29T05:03:55.943 回答