2009-08-13 102 views
6

我想确定某些应用程序状态,特别是列表中选定的项目是否应该存储在核心数据或NSUserDefaults中。应用程序状态何时属于Core Data而不是NSUserDefaults?

一般来说,我认为应用程序首选项和状态应该保留在NSUserDefaults中,并且模型级别的数据应该保存在其他地方,比如核心数据。我的模型到目前为止是:

  • 数据应该存储在所有?如果用户将不能合理地期望它,然后把它扔出去(例如,光标位置不被保存在文本编辑)
  • NSUserDefaults的:
    1. 如果程序是多文档,设置会适用于所有文档
    2. 这是可以想象的是,数据将偏好
    3. 具有模型以外的数据进行配置,使测试的意义(换几个默认有一个模型店)
  • 模型级 个
    1. 的数据清楚地属于作为模型级对象
    2. 的数据的属性是足够大,使得将它存储在NSUserDefaults的会造成性能问题
    3. 这将是困难的或时间密集的为用户重新创建数据(他们肯定会考虑这一信息“数据丢失”的损失)

我打算在存储核心数据的一些实体的排列顺序。如果没有这些信息(即“sortIndex”或“order”属性),每个实体实例将不得不用来自用户默认值的数据增加。

但是,在模型中存储状态看起来像一个滑坡。如果我存储排序顺序,那么它也适合存储选择,因为它们都是列表状态。我的用例的选择数据实际上可能相当大。具体来说,一个列表中的图标取决于每个子列表中的选择。

有没有人有他们相对于NSUserDefaults与数据模型绘制的强硬路线?

回答

5

你没有提到这是基于文档的应用程序(如说,TextEdit)还是​​基于库的应用程序(如说,AddressBook)。

这可能会帮助您决定这些信息的去向:假设一个基于文档的应用程序。假设它的文档置于版本控制之下(当使用Core Data的XML数据存储类型时,这实际上是可行的)。打开应用程序,更改文档的排序顺序。这会弄脏文件吗?这种改变是否值得入住?这个改变对这个仓库的其他用户是否有价值?

通常,排序顺序不足以保证基于文档的存储(ala NSTableView在界面生成器中的自动保存名称)。但是,您的应用可能会优先考虑排序(听起来像是这样)。

因此,没有硬性规定。但是我认为,在版本控制下制作一个文档,可能与其他人分享,这个想法提供了一个很好的智能框架,可以让你的任何一方都能够胜任。

+0

这是一个iPhone应用程序,在我的情况下属于基于库的场景。我喜欢考虑假设的多文档应用程序的心理模型,以及这种变化是否会使应用程序变得肮脏。就我而言,由于选择子列表会改变较高列表的视图(具体来说,子选择会更改在较高视图中的项目旁边显示的图像)。 关于排序,我的意思是排序顺序是用户定义的。也就是说,他们可以任意排列列表(如在iTunes中创建播放列表)。 – orque 2009-08-13 17:24:17

+0

基于“它是否弄脏了文档”我也想添加“对数据的更改是否会导致对撤消堆栈的添加”。撤消对基于文档和基于库的应用都适用,因此它似乎是一种很好的启发式方法。 – orque 2009-08-14 03:36:07

2

我同意rentzsch,但另一种方式来查看:

是数据的选择部分或者是它的元数据?如果是元数据,它是关于单个文档的元数据,还是说它应该适用于接下来打开的任何文档?

特定于文档的元数据可能希望作为扩展属性进行存储。例如,TextMate以这种方式存储文档的选择,就像BBEdit,MPW和其他用于存储选项卡设置,窗口大小等的资源作为资源分叉中的资源一样。元数据被认为是可选的,并且文档如果被删除则是完整的。

如果选择是数据的一个组成部分,那么通过所有方法将其存储在数据中,如果您碰巧以这种方式摆动,则使用核心数据。

如果它不是一个基于文档的应用程序,那么NSUserDefaults是最简单的路径,因为它的支持通常通过绑定构建到常见的NSView子类中。

+0

我同意。我忘记说明我现有的模型是什么,所以我解决了我的问题(我相信这是在这里做的“正确的事情”) 我很难决定信息是否是“数据的组成部分”。随着Rentzsch的模型(我会显示脏点),这变得更容易, – orque 2009-08-13 18:22:45

2

我个人没有在文件本身或NSUSerDefaults中保存首选项之间的界限。

但我一直对明显的趋向:

  • 应用偏好= NSUserDefaults的
  • 文档喜好=文件本身

对于选择状态特别是在,我就判断,如果保持该对用户来说足够重要。如果是,并且足够重要,可以将文档移动到另一台计算机上,我会将其保留在文档中。

如果它不重要(或适用),我不会为保存它而烦心。

+0

我认为这是让我绊倒,因为在iPhone上,我不认为任何应用程序具有“文件”;这只是数据。由于切换应用意味着退出和重新启动,保存状态变得更加重要。 – orque 2009-08-13 18:30:13

+0

我认为即使在iPhone应用程序中 - 如果用户当前位置的部分状态对数据非常重要,我会保存它,如果不是,我不会打扰。听起来可能是这样,所以我会用数据保存它。 – Lucien 2009-08-17 17:59:26

相关问题