NSBundle,它可以用来保存项目文件吗?

时间:2011-01-27 08:42:14

标签: objective-c cocoa macos nsbundle

我正在构建一个可用于创建“项目”的Mac OS X应用程序。当用户保存项目时,他们将保存许多资源:图像文件,文本文件,sqlite文件等。

我可以在Documents中为每个项目创建一个文件夹,在该文件夹中我可以放置所有项目资产,只需包含一个用于打开项目的项目文件。

我读过有关我想使用的NSBundle。但我只是在应用程序包的上下文中阅读了它们。是否可以这种方式使用NSBundle?用户只能看到一个文件,并且可以随意移动它。

使用NSBundle做我正在尝试的事情是否有意义?还是有另一种方法可以做到这一点吗?

(我对MacOS X编程很新)

更新

我相信iPhoto使用这种方法来存储“iPhoto图库”,这就是我想对我的应用程序做的,是NSBundle我应该研究什么?

3 个答案:

答案 0 :(得分:4)

是的,它可能并且过去曾在很多应用中使用过。该方法在this document中描述。一旦在您的应用程序的Info.plist中明确声明,Finder会将生成的包显示为一个文件。

但是,我建议你不要这样做。苹果公司自己的Keynote过去一直在使用捆绑方式,但它不再使用它了。同样,OmniGraffle(OS X上的图表应用程序,历史悠久)使用bundle来保存项目,但它也停止了这样做。

原因是虽然Finder将其显示为文件,但非Apple电子邮件软件或任何浏览器等仍将该捆绑视为目录。如果用户想要以捆绑包格式将您的文档附加到他/她在浏览器中的Gmail中撰写的电子邮件,那将是一团糟。这困扰了很多人。

所以,这是可能的,但我不推荐它。一种方法是使用压缩包作为用户可见文件,并在用户将其打开到临时目录时解压缩。然后,您可以使用NSBundle和/或NSFileWrapper apis来访问其中的文件。

答案 1 :(得分:2)

Apple的File Wrapper示例似乎是您想要的: http://developer.apple.com/library/mac/#samplecode/PersistentDocumentFileWrappers/Introduction/Intro.html

它还演示了如何在bundle中保存Core Data持久性存储。如果您只想存储资源,可以将该部分保留。

答案 2 :(得分:0)

NSBundle 类代表应用程序包,可用于访问应用程序中的资源,但您可以使用它来获取应用程序数据,而不是用户数据。

对于您提到的每种资源,有一种保存此类型的方法,例如,对于图像文件,您可以使用 NSData 将图像数据保存到磁盘,对于文本文件,可以使用方法writeToFile:atomically:encoding:error:

您可能希望查看核心数据http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/cdProgrammingGuide.html),这是一个用于管理用户数据模型的非常好的框架,以确定这是否符合您的需求。