NSFileCoordinator coordinateWritingItemAtURL长时间延迟

时间:2015-04-16 15:15:02

标签: objective-c cocoa nsfilecoordinator nsfilepresenter

我在我的应用中设置了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
}];

在第一次写入时,写入块在1 ms内发生。但在那之后,调用coordinateWritingItemAtURL和正在执行的写入块之间有大约0.5秒的延迟。

这是预期的行为吗?

NSFileCoordinatorNSFilePresenter

Some of the documentation表示使用prepareForReadingItemsAtURLs:writingItemsAtURLs:options:error:byAccessor:进行批量操作,但是当我不批处理时,如此长时间的延迟似乎很奇怪

更新:阅读也会发生这种情况。

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

更新3:使用此API在应用及其扩展程序之间进行协调是apparentlybad idea。但问题仍然存在。

2 个答案:

答案 0 :(得分:4)

参考 File System Programming Guide ,您可以阅读以下内容:

  

您可能希望避免直接从文件中添加更改   演示者方法。相反,将一个块异步调度到一个   调度队列并在以后处理更改。这让你   在您的应用程序方便处理更改而不会导致   发起更改的文件协调员不必要的延迟。   当然,在保存或放弃对文件的控制时(例如在    relinquishPresentedItemToReader :,    relinquishPresentedItemToWriter :或    savePresentedItemChangesWithCompletionHandler :方法)你应该   执行所有必要的操作立即,而不是延迟

我认为这是你推迟行动的情况。

可能的解决方案:

请仔细阅读 this ,为了正确处理多个连续的写作操作, relinquishPresentedItemToWriter ,可以完成这项工作,同样适用于读取文件 relinquishPresentedItemToReader ,假设多个不同的对象正在尝试读取和写入相同的文件。

P.S:

我不知道你的应用程序究竟做了什么,但我希望你读过这个:

  

如果您要实施基于文档的应用,则无需执行此操作   将文件演示者语义合并到NSDocument子类中。   NSDocument类已经符合NSFilePresenter协议   并实现适当的方法。因此,你的所有文件   自动注册为自己对应的演示者   文件并执行保存更改和跟踪更改等操作   文档。

答案 1 :(得分:3)

Is it possible to use options NSFileCoordinatorReadingImmediatelyAvailableMetadataOnly for reading and NSFileCoordinatorWritingContentIndependentMetadataOnly for writing in some cases? Looks like this iOS8 options can help you.