1

我正在 OS X 上编写一个基于文档的应用程序。这个应用程序的一个特点是“导入”功能。

此函数将从磁盘读取包含原始 BLOB 数据的数据文件,并且可以将其解析为一个或多个文档。对于这个功能,我将不得不以编程方式创建文档。主要问题是,它NSDocumentController只有makeDocumentWithContentsOfURL:ofType:error:从现有数据创建文档的方法。有几种方法可以创建我的文档,我想知道哪一种是最干净的方法。

  1. 我可以将文档的数据写入磁盘上的单独文件中,然后makeDocumentWithContentsOfURL:ofType:error为每个文件调用 :。这似乎相当不雅,并且可能会因大量数据而减慢应用程序的速度。
  2. 我可以使用创建空文档NSDocumentController并填写数据。
  3. 我可以在导入函数中创建文档并将它们添加到NSDocumentControllerwithaddDocument:方法中。我不知道这是否可行,因为这种方法似乎是子类化的钩子。
  4. 我可以子类NSDocumentController添加一个makeDocumentFromData:ofType:error:方法。我认为这会很干净但更复杂。

你怎么看?

最好的问候,克里斯

4

3 回答 3

1

这不会扩展到具有许多 blob 的源文档。如果一个源文档会让您创建 50,000 个文档怎么办?

单独的转换器应用程序会更好。您可以将单个结果文档提取到 NSOperation 子类中,以便您可以并行提取文档。此应用程序将能够处理任意数量的文档,其 UI 将是一个进度条,并且可能是一个正在提取的结果文档的列表(在目前已提取的文档旁边带有显示按钮)。

您可以将此应用程序与您的主应用程序捆绑在一起,将其捆绑您的主应用程序中(并在用户尝试以源格式打开文档时启动它),或使其成为一个完全独立的产品。

于 2009-12-31T13:25:18.463 回答
1

对于从一个来源创建多个文档确实合适的情况(即,您知道您不会创建不合理数量的文档):

2. 我可以使用 NSDocumentController 创建空文档并填写数据。

4. 我可以继承 NSDocumentController 并添加一个makeDocumentFromData:ofType:error:方法。我认为这会很干净但更复杂。

我喜欢 #2 作为 #4 的实现。

于 2009-12-31T13:30:48.190 回答
1

如果您的目标是 Tiger 或更高版本,为什么不使用该-[NSDocument readFromData:ofType:error]方法然后调用-[NSDocumentController addDocument:]?那么你很高兴不涉及子类化:)

要为每个对象创建数据,您可以使用-[NSData bytes]一些指针算法获得指向字节的指针,-[NSData initWithBytesNoCopy:length:]这样就无需创建临时文件。

于 2010-01-02T05:59:24.450 回答