从NSData创建多个NSDocuments的最简洁方法

时间:2009-12-31 12:46:46

标签: objective-c cocoa macos nsdocument

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

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

  1. 我可以将文档的数据写入磁盘上的单独文件,并为每个文件调用makeDocumentWithContentsOfURL:ofType:error :.这似乎相当不优雅,可能会使用大量数据减慢应用程序。
  2. 我可以使用NSDocumentController创建空文档并填入数据。
  3. 我可以在导入功能中创建文档,并使用NSDocumentController方法将其添加到addDocument:。我不知道这是否会起作用,因为这个方法似乎是子类化的一个钩子。
  4. 我可以将NSDocumentController子类化为添加makeDocumentFromData:ofType:error:方法。我认为这会很干净但更复杂。
  5. 您怎么看?

    最诚挚的问候, 克里斯

3 个答案:

答案 0 :(得分:1)

这不会缩放到包含许多blob的源文档。如果源文档会创建50,000个文档怎么办?

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

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

答案 1 :(得分:1)

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

  

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

     

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

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

答案 2 :(得分:1)

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

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