标签: nsfilepresenter

NSFileCoordinator coordinateWritingItemAtURL长时间延迟

我正在设置NSFileCoordinatorNSFilePresenter在我的应用程序中,因此我可以安全地从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并且NSFilePresenterprepareForReadingItemsAtURLs:writingItemsAtURLs:options:error:byAccessor:用于批处理操作,但是当我不进行批处理时,得到如此长的延迟似乎很奇怪.

更新:这也发生在阅读上.

更新2: 是一个重现问题的示例项目.

更新3:使用此API在应用程序及其扩展程序之间进行协调显然是一个 主意.但问题仍然存在.

cocoa objective-c nsfilecoordinator nsfilepresenter

9
推荐指数
1
解决办法
840
查看次数

跟踪外部文件内容更改

我已经完全实现了NSFilePresenter协议,NSFileCoordinator用于跟踪对导入的文件夹/文件树所做的外部更改.它通常有效.

但是,我仍然有点困惑.

  • 我已经实现了几乎所有(如果不是全部)协议的功能.
  • presentedSubitemDidChangeAtURL:,presentedSubitemAtURL:didMoveToURL:并且presentedItemDidChange是唯一被调用的人
  • 我能够成功跟踪正在添加的新文件夹或文件移动.然而,当跟踪文件内容更改(由另一个应用程序编辑和保存)时,事情变得有点复杂:要调用的方法是presentedItemDidChange(在其他情况下显然也会调用)

我错过了什么?

不应该presentedItemDidGainVersion:savePresentedItemChangesWithCompletionHandler:被叫?

任何帮助或指示都非常受欢迎!:)

cocoa objective-c nsfilecoordinator nsfilepresenter

7
推荐指数
0
解决办法
137
查看次数

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

我正在编写一个小型macOS应用程序,希望在其中查看文件夹中的更改。它不需要监视子文件夹,我只想在文件添加到文件夹或删除文件时收到通知。

看起来NSFileCoordinator和/或NSFilePresenter可以用来实现这一目标,但是我无法理解如何使用它们来实现这一目标。

理想情况下,无需包含第三方框架即可解决此问题。

macos cocoa nsfilecoordinator nsfilepresenter swift

7
推荐指数
2
解决办法
1406
查看次数

为什么 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)

macos nsfilepresenter

5
推荐指数
1
解决办法
1683
查看次数