NSFilePresenter -presentedSubitemDidAppearAtURL:方法永远不会被调用

Posted

技术标签:

【中文标题】NSFilePresenter -presentedSubitemDidAppearAtURL:方法永远不会被调用【英文标题】:NSFilePresenter -presentedSubitemDidAppearAtURL: method never gets called 【发布时间】:2012-09-12 13:49:30 【问题描述】:

我有一个符合 NSFilePresenter 协议的对象,它代表我的基于文档的应用程序文档包。当在包内创建新文件时,无论是使用具有适当 NSFileCoordination 方法的编程方式使用 NSFileManager 还是通过 Finder,我都只收到了 -presentedSubitemDidChangeAtURL: 事件,但在这种情况下似乎并不那么明显 -presentedSubitemDidAppearAtURL:

这是预期的行为还是我做错了什么?

NSFilePresenter 中-presentedSubitemDidAppearAtURL: 上的 cmets 声明很清楚:

通知该目录包含的文件或目录已添加。如果这个方法没有实现但是-presentedItemDidChange实现了,并且目录实际上是一个文件包,那么文件协调机制就会调用-presentedItemDidChange

【问题讨论】:

我猜你没有实现-presentedItemDidChange Here 是一个与此问题相关的好帖子,我的结论是;不要使用NSFilePresenter GCD 似乎是要走的路。 Handling Filesystem Events with GCD @Eonil 就像你有任何选项可供选择。 【参考方案1】:

在解决这个确切问题很长一段时间后,我向 Apple 提出了技术支持问题。他们的反应是这是一个bug,我们现在唯一能做的就是通过-presentedSubitemDidChangeAtURL:来做所有事情。

我鼓励任何遇到此问题的人提交错误 (https://bugreport.apple.com) 以鼓励 Apple 尽快解决此问题。

【讨论】:

2014 年 11 月还是一样。我为此浪费了大约一天的时间。还是谢谢。 现在 ios 9.1 - 还是一样。 看在上帝的份上,iOS 9.2 同样的错误。 2016,iOS 10b7 并且仍然很强大 :) 现在2021年了,iOS 14.6这个bug还没修复【参考方案2】:

https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSFilePresenter_protocol/

您的 presenter 对象不会收到有关直接使用低级读写调用对文件所做的更改的通知。 只有更改通过文件协调器会导致通知

【讨论】:

原帖提到他确实使用了文件协调器。具体来说,with proper NSFileCoordination methods or via Finder。请注意,Finder 确实使用文件协调,因此应进行所有委托调用。

以上是关于NSFilePresenter -presentedSubitemDidAppearAtURL:方法永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

NSFileCoordinator 的长时间延迟 coordinateWritingItemAtURL

验证 iCloud 容器上的文档是不是存在

Swift / Cocoa:如何观察文件夹的变化?