我正在设置NSFileCoordinator并NSFilePresenter在我的应用程序中,因此我可以安全地从AppleWatch应用程序执行文件IO.在我的代码中有一些地方我快速连续几次写入文件.这本身就是一个问题,我正在努力纠正它,但我注意到这个过程中有些奇怪的行为.
我像这样包装我的写作:
//In a class that implements NSFilePresenter:
NSFileCoordinator *coord = [[NSFileCoordinator alloc]initWithFilePresenter:self];
[coord coordinateWritingItemAtURL:self.presentedItemUrl options:0 error:nil byAccessor:^(NSURL *url)
{
//do my writing here using CFWriteStreamRef or NSOutputStream
}];
Run Code Online (Sandbox Code Playgroud)
在第一次写入时,写入块在1 ms内发生.但在那之后,调用coordinateWritingItemAtURL和正在执行的写入块之间大约有0.5秒的延迟.
这是预期的行为吗?
一些文档用于批处理操作NSFileCoordinator并且NSFilePresenter说prepareForReadingItemsAtURLs:writingItemsAtURLs:options:error:byAccessor:用于批处理操作,但是当我不进行批处理时,得到如此长的延迟似乎很奇怪.
更新:这也发生在阅读上.
更新2: 这是一个重现问题的示例项目.
我已经完全实现了NSFilePresenter协议,NSFileCoordinator用于跟踪对导入的文件夹/文件树所做的外部更改.它通常有效.
但是,我仍然有点困惑.
presentedSubitemDidChangeAtURL:,presentedSubitemAtURL:didMoveToURL:并且presentedItemDidChange是唯一被调用的人presentedItemDidChange(在其他情况下显然也会调用)我错过了什么?
不应该presentedItemDidGainVersion:或savePresentedItemChangesWithCompletionHandler:被叫?
任何帮助或指示都非常受欢迎!:)
我正在编写一个小型macOS应用程序,希望在其中查看文件夹中的更改。它不需要监视子文件夹,我只想在文件添加到文件夹或删除文件时收到通知。
看起来NSFileCoordinator和/或NSFilePresenter可以用来实现这一目标,但是我无法理解如何使用它们来实现这一目标。
理想情况下,无需包含第三方框架即可解决此问题。
我正在尝试监视本地和 iCloud 目录中的文件更改并实现了 NSFilePresenter 协议方法,但唯一被调用的方法是presentedItemAtURL.
我是否正确假设我应该能够监视本地或 iCloud 目录并在任何进程添加、修改或删除目录中的文件时收到通知。
这是 OS X 应用程序的基本代码:
- (void)awakeFromNib {
_presentedItemURL = myDocumentsDirectoryURL;
_presentedItemOperationQueue = [[NSOperationQueue alloc] init];
[_presentedItemOperationQueue setMaxConcurrentOperationCount: 1];
_fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:self];
}
- (NSURL*) presentedItemURL {
FLOG(@" called %@", _presentedItemURL);
return _presentedItemURL;
}
- (NSOperationQueue*) presentedItemOperationQueue {
FLOG(@" called");
return _presentedItemOperationQueue;
}
- (void)presentedItemDidChange {
FLOG(@" called");
dispatch_async(dispatch_get_main_queue(), ^{
[self reloadData];
});
}
-(void)accommodatePresentedItemDeletionWithCompletionHandler:(void (^)(NSError *errorOrNil))completionHandler
{ FLOG(@" called");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self reloadData];
}];
completionHandler(nil);
}
-(void)presentedSubitemDidChangeAtURL:(NSURL …Run Code Online (Sandbox Code Playgroud)