我在我的应用中设置了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
}];
在第一次写入时,写入块在1 ms内发生。但在那之后,调用coordinateWritingItemAtURL
和正在执行的写入块之间有大约0.5秒的延迟。
这是预期的行为吗?
NSFileCoordinator
和NSFilePresenter
的 Some of the documentation表示使用prepareForReadingItemsAtURLs:writingItemsAtURLs:options:error:byAccessor:
进行批量操作,但是当我不批处理时,如此长时间的延迟似乎很奇怪
更新:阅读也会发生这种情况。
更新2: Here是一个重现问题的示例项目。
更新3:使用此API在应用及其扩展程序之间进行协调是apparently和bad idea。但问题仍然存在。
答案 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.